前言:
很早之前就有看过ReactiveCocoa,那会看的时候知道是一个新的框架关于响应式编程,具体什么也没有深入研究,今天也对ReactiveCocoa这个框架的使用进行了一定的了解。在github中有对它一个简单的介绍:
大概的意思就是说ReactiveCocoa这个框架灵感来源于响应函数式编程思想,RAC提供的“事件流”概念,采用能够超时发送的信号和信号产生者来替代以前通过声明多种变量。事件流统一了以前的所有事件响应方式,包括代理,block回调,通知,target-action,观察者模式等。因为这些都是事件响应的不同方式而已,所以统一成同一种方式更方便程序员管理代码。
到这里我们就初识ReactiveCocoa,它是统一多种事件响应方式的一个github发布的开源框架。
ReactiveCocoa在github上面的地址:https://github.com/ReactiveCocoa/ReactiveCocoa。
将框架下载下来打开可以看见框架对foundation框架和UIkit框架添加了一个分类来实现对事件响应方式进行统一的。
ReactiveCocoa:
高聚合,低耦合
的思想。RACSignal:
1 - (void)useTheRACSignal 2 { 3 /** 4 * 创建信号 5 */ 6 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { 7 /** 8 * 这个block是在该信号执行subscribeNext被订阅的时候自动调用 9 */ 10 // 发送信号 11 [subscriber sendNext:@"value"];// subscriber 表示订阅者用于发送对象的 12 13 // 发送信号结束后如果不再发送信号最好调用一下发送完成方法取消订阅信号 14 [subscriber sendCompleted]; 15 return [RACDisposable disposableWithBlock:^{ 16 //RACDisposable用于取消订阅和清理资源的,在信号发送完成或者失败的时候调用 17 // 这个block调用的时候:当信号发送完成或失败的时候自动执行这个block取消订阅者 18 // 执行完这个block后,当前信号就不在被订阅了 19 NSLog(@"信号就不再订阅的范围内"); 20 }]; 21 }]; 22 // 订阅该信号,否则该信号一直都是冷信号,值改变了也不会触发,只有订阅了该信号才会触发,信号才会变成热信号.信号订阅调用的是subscribeNext方法 23 [signal subscribeNext:^(id x) { 24 // 该block调用的时候:每当有信号发出的时候就会回调该block 25 NSLog(@"接收到数据:%@",x); 26 }]; 27 // 信号可以被多次订阅 28 [signal subscribeNext:^(id x) { 29 NSLog(@"第二次订阅 %@",x); 30 }]; 31 } 32
RACSubject:
信号提供者类:RACSubject,能够充当信号,又能够发送信号
RACSubject的简单使用:
1 -(void)useTheRACSubject 2 { 3 // * 创建信号,创建信号的时候没有block回调 4 RACSubject *signalSubject = [RACSubject subject]; 5 // 订阅该信号(可以多次订阅该信号) 6 [signalSubject subscribeNext:^(id x) { 7 //block回调的时候就是接受到数据的时候 8 NSLog(@"第一次订阅,接受到的数据:%@",x); 9 }]; 10 [signalSubject subscribeNext:^(id x) { 11 NSLog(@"第二次订阅,接收到的数据%@",x); 12 }]; 13 // 发送信号 14 [signalSubject sendNext:@"wahaha"]; 15 }
RACReplaySubject:
重复提供信号类:RACReplaySubject,这是RACSubject的子类,跟RACSubject的区别就是可以先发送信号再订阅,多次发送的值在订阅的时候都能够收到数据
RACReplaySubject的简单使用:
- (void)useTheRACReplaySubject { // 创建信号 RACReplaySubject *replaySubject = [RACReplaySubject subject]; // 发送信号(在没有订阅该信号之前就可以先发送值,在以后订阅信号的时候都会收到) [replaySubject sendNext:@1]; [replaySubject sendNext:@2]; // 订阅该信号 [replaySubject subscribeNext:^(id x) { NSLog(@"第一次订阅,收到的值: %@",x); }]; [replaySubject subscribeNext:^(id x) { NSLog(@"第二次订阅,收到的值:%@",x); }];
}
利用ReactiveCocoa充当代理的功能实现页面间传值:
大概思路就是:在跳转的第二个页面中定义一个RACSubject类型的属性,在第一个页面要跳转到第二个页面的时候创建这个信号并且订阅这个信号,在第二个页面跳转回来的时候让这个信号发送值出来。部分代码如下:
第一个页面的buttonAction:
1 SecondViewController *secondVC = [[SecondViewController alloc]init]; 2 //创建信号 3 secondVC.subject = [RACSubject subject]; 4 // //订阅第二个页面的信号,当第二个页面的信号发送value的时候在这里回调就改变这个页面的颜色 5 [secondVC.subject subscribeNext:^(id x) { 6 UIColor *color = (UIColor *)x; 7 self.view.backgroundColor = color; 8 }]; 9 [self.navigationController pushViewController:secondVC animated:YES];
第二个页面的.h文件中:
1 #import <UIKit/UIKit.h> 2 #import "ReactiveCocoa.h" 3 @interface SecondViewController : UIViewController 4 @property(nonatomic,strong)RACSubject *subject; 5 @end
第二个页面的.m文件中返回按钮的方法:
1 - (void)backAction:(UIBarButtonItem *)btn 2 { 3 UIColor *color = [UIColor redColor]; 4 [self.subject sendNext:color]; 5 [self.navigationController popViewControllerAnimated:YES]; 6 }