ReactiveCocoa

DomKellow 9年前

来自: http://my.oschina.net/u/2346786/blog/614316


1.ReactiveCocoa作用

    在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式。其实这些事件,都可以通过RAC处理。


2.RACSiganl

    RACSiganl:信号类,只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。

    RACSubscriber:表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。

    RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。

    //1.创建信号      RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {          //block调用时刻:每当有订阅者订阅信号,就会调用block                    //2.发送信号          [subscriber sendNext:@1];                    //如果不再发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅          [subscriber sendCompleted];                    return [RACDisposable disposableWithBlock:^{              //block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅              NSLog(@"信号被销毁");          }];      }];                  //3.订阅信号      [signal subscribeNext:^(id x) {          //block调用时刻:每当有信号发送数据,就会调用该方法          NSLog(@"接收到的数据:%@",x);      }];

 

3.RACSubject与RACReplaySubject

     RACSubject:信号提供者,自己可以充当信号,又能发送信号。subject可以想成是signal的变体,就像NSMutableArray相对于NSArray⼀一样。它们是非RAC的代码和RAC代码之间的桥梁。

    RACReplaySubject:重复提供信号类,RACSubject的子类。

    RACReplaySubject与RACSubject区别:

         1).RACReplaySubject可以先发送信号,再订阅信号,RACSubject就不可以。

         2).可以设置capacity数量来限制缓存的value的数量,即只缓充最新的几个值。

    //1.创建信号      RACSubject *subject = [RACSubject subject];            //2.订阅信号      [subject subscribeNext:^(id x) {          //block调用时刻:当信号发出新值,就会调用          NSLog(@"第一个订阅者%@",x);      }];      [subject subscribeNext:^(id x) {          //block调用时刻:当信号发出新值,就会调用          NSLog(@"第二个订阅者%@",x);      }];            //3.发送信号      [subject sendNext:@"1"];                        //1.创建信号      RACReplaySubject *replaySubject = [RACReplaySubject subject];     // RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:0];            //2.发送信号      [replaySubject sendNext:@1];      [replaySubject sendNext:@2];            //3.订阅信号      [replaySubject subscribeNext:^(id x) {          NSLog(@"第一个订阅者%@",x);      }];      [replaySubject subscribeNext:^(id x) {          NSLog(@"第二个订阅者%@",x);      }];

    RACSubject替代代理

情景:跳转到另一个vc,TwoVC发送通知,VC收到回调的通知

VC  - (IBAction)click:(UIButton *)sender {        TwoViewController *twoVC = [[TwoViewController alloc] init];            //设置代理信号      twoVC.delegateSubject = [RACSubject subject];            //订阅代理信号      [twoVC.delegateSubject subscribeNext:^(id x) {          NSLog(@"点击了通知按钮,%@",x);      }];            //跳转      [self presentViewController:twoVC animated:YES completion:nil];    }    TwoVC      if (self.delegateSubject) {          //发送信号          [self.delegateSubject sendNext:@"已跳转到TwoVC"];      }