ReactiveCocoa
来自: 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"]; }