ReactiveCocoa之RACSubject用法(四)

前端之家收集整理的这篇文章主要介绍了ReactiveCocoa之RACSubject用法(四)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.RACSubject:RACSubject:信号提供者,自己可以充当信号,又能发送信号。

2.使用场景:通常用来代替代理,有了它,就不必要定义代理了。

需求:

1.给当前控制器添加一个按钮,push到另一个控制器界面

2.另一个控制器view中有个按钮,点击按钮,返回控制器的第一个页面和接收到第二个界面的消息

第一个界面:

[objc] view plain copy
  1. -(void)viewDidLoad{
  2. [superviewDidLoad];
  3. /*
  4. //RACSubject使用步骤
  5. //1.创建信号[RACSubjectsubject],跟RACSiganl不一样,创建信号时没有block。
  6. //2.订阅信号-(RACDisposable*)subscribeNext:(void(^)(idx))nextBlock
  7. //3.发送信号sendNext:(id)value
  8. //RACSubject:底层实现和RACSignal不一样。
  9. //1.调用subscribeNext订阅信号,只是把订阅者保存起来,并且订阅者的nextBlock已经赋值了。
  10. //2.调用sendNext发送信号,遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock。
  11. */
  12. self.view.backgroundColor=[UIColorwhiteColor];
  13. selfbuildUI];
  14. }
  15. -(void)buildUI{
  16. self.button.frame=CGRectMake(100,100,80,30);
  17. [self.viewaddSubview:self.button];
  18. }
  19. #pragmamark---lazyloading
  20. UIButton*)button{
  21. if(!_button){
  22. _button=[[UIButtonalloc]init];
  23. [_buttonsetBackgroundColor:[UIColorredColor]];
  24. [_buttonsetTitle:@"push"forState:UIControlStateNormal];
  25. [[_buttonrac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(idx){
  26. TwoViewController*twoVC=[[TwoViewControllerinit];
  27. twoVC.subject=[RACSubjectsubject];
  28. [twoVC.subjectidx){//这里的x便是sendNext发送过来的信号
  29. NSLog(@"%@",x);
  30. self.buttonsetTitle:x }];
  31. self.navigationControllerpushViewController:twoVCanimated:YES];
  32. return_button;
  33. }

TwoViewController

copy @H_355_404@
    brownColor];
  1. -(void)buildUI{
  2. self.button.frame=CGRectMake(50,50,30);
  3. purpleColor];
  4. #pragmamark---lazyloading
  5. UIButton*)button{
  6. if(!_button){
  7. _button=[[UIButtongrayColor]];
  8. setTitle:@"pop"forState:UIControlStateNormal];
  9. [[_buttonidx){
  10. self.subjectsendNext:@"ws"];
  11. popViewControllerAnimated:YES];
  12. }];
  13. return_button;
  14. }

*总结:

我们完全可以用RACSubject代替代理/通知,确实方便许多

这里我们点击TwoViewControllerpop的时候将字符串"ws"传给了ViewControllerbuttontitle

步骤:

// 1.创建信号

RACSubject *subject = [RACSubject subject];

// 2.订阅信号

[subject subscribeNext:^(id x) {

// block:当有数据发出的时候就会调用

// block:处理数据

NSLog(@"%@",x);

}];

// 3.发送信号

[subject sendNext:value];

**注意:~~**

RACSubjectRACReplaySubject的区别

RACSubject必须要先订阅信号之后才能发送信号,RACReplaySubject可以先发送信号后订阅.

RACSubject代码中体现为:先走TwoViewControllersendNext,后走ViewControllersubscribeNext订阅

RACReplaySubject代码中体现为:先走ViewControllersubscribeNext订阅,后走TwoViewControllersendNext

可按实际情况各取所需。

猜你在找的React相关文章