1.ReactiveCocoa简介
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾。
2.ReactiveCocoa作用
在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式。
其实这些事件,都可以通过RAC处理
ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高聚合,低耦合的思想
在RAC中最核心的类RACSiganl
````objc//RACSignal信号使用步骤:1:创建信号 2:订阅信号 3: 发送信号//1:创建信号RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {//didSubscribe调用:只有被订阅了,才调用//didSubscribe作用:发送数据//3:发送信号[subscriber sendNext:@1];returnnil; }];//2:订阅信号[signal subscribeNext:^(idx) {//nextBlock调用:只有发送数据了才会调用//nextBlock作用:接受数据,展示UINSLog(@"%@",x); }];
RACDisposable: 用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
--不想监听某个信号时,可以通过它主动取消订阅信号。
-(void)racWithSignalDisposable{//1:创建信号RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) { _subscriber = subscriber;//3发送信号[subscriber sendNext:@1];return[RACDisposable disposableWithBlock:^{NSLog(@"取消订阅"); }]; }];//2:订阅信号RACDisposable *disposable = [signal subscribeNext:^(idx) {NSLog(@"%@",x); }];//主要订阅者在就不会取消订阅者[disposable dispose];}
RACSubject:RACSubject:信号提供者,自己可以充当信号,又能发送信号。
使用场景:通常用来代替代理,有了它,就不必要定义代理了。
-(RACSubject *)subject{if(_subject ==nil) { _subject = [RACSubject subject]; }return_subject;}-(IBAction)clickBtn:(UIButton*)btn{ [self.subjectsendNext:@1];}-(void)racWithDelegate{//订阅[_redView.subjectsubscribeNext:^(idx) {NSLog(@"控制器做了一件事情%@",x); }];}
RACTuple: 元组类,类似NSArray,用来包装值.
-(void)racWtihTuple{//rac集合RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"123",@"234",@1]];//取出rac集合中的第0个元素NSString*str = tuple[0];NSLog(@"%@",str);}
RACSequence:RAC中的集合类,用于代替NSArray,NSDictionary,可以使用它来快速遍历数组和字典。
-(void)racWithAarray{//rac遍历数组//创建一个数组NSArray*arry = @[@"123",@"321",@"111"];//把数组转变为一个集合RACSequence *sequence = arry.rac_sequence;//把集合转换为一个信号RACSignal *singnal = sequence.signal;//使用信号订阅信息[singnal subscribeNext:^(idx) {NSLog(@"%@",x); }]; [arry.rac_sequence.signalsubscribeNext:^(idx) {NSLog(@"%@",x); }];}
实例:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{self.person.userName= [NSStringstringWithFormat:@"zhangsan---%u",arc4random_uniform(100)];}//rac实现kvo-(void)racWithKvo{ [RACObserve(self.person, userName) subscribeNext:^(idx) {self.nameLabel.text= x; }];} [_accountTextFiled.rac_textSignalsubscribeNext:^(idx) {self.nameLabel.text= x; }];
多个输入文件作为信号源
多用于登陆等业务需求
p.p1 {margin:0.0px0.0px0.0px0.0px; font:11.0px'PingFang SC'; color:#4cbf57}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff; min-height: 13.0px}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #93c86a}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #4cbf57}span.s1 {font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s4 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s5 {font-variant-ligatures: no-common-ligatures; color: #00afca}span.s6 {font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s7 {font: 11.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s8 {font-variant-ligatures: no-common-ligatures; color: #93c86a}span.s9 {font-variant-ligatures: no-common-ligatures; color: #e44448}//多个文本框输入信号组合使用-(void)racTextFiledsDemo{ RACSignal *nameSignal = [self.nameTextFiled rac_textSignal]; RACSignal *pwdSignal = [self.pwdTextFiled rac_textSignal]; NSArray *signals = @[nameSignal,pwdSignal];//订阅信号[[RACSignal combineLatest:signals]subscribeNext:^(RACTuple *x) { NSString *name = x.first; NSString *pawd = x.second; NSLog(@"%@%@",x,name);if(name.length>0&& pawd.length>0) {self.photoImageView.image = [UIImage imageNamed:@"Demo"]; }elseif(name.length >0|| pawd.length >0){self.photoImageView.image = [UIImage imageNamed:@"Demo1"]; } }];}
rac_signalForSelector的使用,代替代理(不需要传值的情况下)
p.p1{margin:0.0px0.0px0.0px0.0px;font:11.0pxMenlo;color:#4cbf57}p.p2 {margin:0.0px0.0px0.0px0.0px;font:11.0pxMenlo;color:#93c86a}p.p3 {margin:0.0px0.0px0.0px0.0px;font:11.0pxMenlo;color:#ffffff;min-height:13.0px}p.p4 {margin:0.0px0.0px0.0px0.0px;font:11.0pxMenlo;color:#ffffff}span.s1 {font-variant-ligatures: no-common-ligatures;color:#ffffff}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font:11.0px'PingFang SC';font-variant-ligatures:no-common-ligatures}span.s4 {font-variant-ligatures: no-common-ligatures;color:#c2349b}span.s5 {font-variant-ligatures: no-common-ligatures;color:#00afca}span.s6 {font-variant-ligatures: no-common-ligatures;color:#e44448}span.s7 {font-variant-ligatures: no-common-ligatures;color:#93c86a} //rac_signalForSelector:监听某对象有没有调用某方法 [[self.readView rac_signalForSelector:@selector(clickBtn:)] subscribeNext:^(id x) {NSLog(@"clickBtn"); }];[[self rac_signalForSelector:@selector(didReceiveMemoryWarning)]subscribeNext:^(id x) {NSLog(@"clickBtn"); }];
p.p1{margin:0.0px0.0px0.0px0.0px;font:11.0pxMenlo;color:#ffffff}p.p2 {margin:0.0px0.0px0.0px0.0px;font:11.0pxMenlo;color:#ffffff;min-height:13.0px}span.s1 {font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures;color:#c2349b}@weakify(self) [RACObserve(self.person, name) subscribeNext:^(id x) { @strongify(self)
全部代码
p.p1{margin:0.0px0.0px0.0px0.0px; font:11.0px Menlo; color:#ffffff}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff; min-height: 13.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e44448}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #4cbf57}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #93c86a}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'PingFang SC'; color: #4cbf57}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #00afca}span.s1 {font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s3 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s4 {font-variant-ligatures: no-common-ligatures; color: #00afca}span.s5 {font: 11.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s6 {font-variant-ligatures: no-common-ligatures; color: #e44448}span.s7 {font-variant-ligatures: no-common-ligatures; color: #93c86a}span.s8 {font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s9 {font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s10 {font: 11.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #e44448}span.s11 {font-variant-ligatures: no-common-ligatures; color: #d28f5a}span.s12 {font-variant-ligatures: no-common-ligatures; color: #4cbf57}span.s13 {font: 11.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #4cbf57}}-(void)dealloc{NSLog(@"viewController dealloc");}//rac代替代理-(void)racWithDelegate{// 1:rac的subject 2:rac的select//rac_signalForSelector:监听某对象有没有调用某方法[[self.readViewrac_signalForSelector:@selector(clickBtn:)] subscribeNext:^(idx) {NSLog(@"clickBtn"); }]; [[selfrac_signalForSelector:@selector(didReceiveMemoryWarning)] subscribeNext:^(idx) {NSLog(@"clickBtn"); }];}//多个文本框输入信号组合使用-(void)racTextFiledsDemo{ RACSignal *nameSignal = [self.nameTextFiledrac_textSignal]; RACSignal *pwdSignal = [self.pwdTextFiledrac_textSignal];NSArray*signals = @[nameSignal,pwdSignal];//订阅信号[[RACSignal combineLatest:signals]subscribeNext:^(RACTuple *x) {NSString*name = x.first;NSString*pawd = x.second;NSLog(@"%@%@",x,name);if(name.length>0&& pawd.length>0) {self.photoImageView.image= [UIImageimageNamed:@"Demo"]; }elseif(name.length>0|| pawd.length>0){self.photoImageView.image= [UIImageimageNamed:@"Demo1"]; } }];}//rac及时刷新UI-(void)racWithUI{ [_nameTextFiled.rac_textSignalsubscribeNext:^(idx) {self.nameLabel.text= x; }];}//rRAC中的集合类,用于代替NSArray,NSDictionary,可以使用它来快速遍历数组和字典。-(void)racWithSeq{NSArray*array = @[@"7",@"3",@"4",@"5"];// //把数组转为一个集合// RACSequence *sequence = array.rac_sequence;//// //把集合转为一个信号// RACSignal *signal = sequence.signal;//// //使用订阅者订阅信号// [signal subscribeNext:^(id x) {//// NSLog(@"%@",x);// }];[array.rac_sequence.signalsubscribeNext:^(idx) {NSLog(@"%@",x); }];}-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{self.person.name= [NSStringstringWithFormat:@"liuYAHUA---%u",arc4random_uniform(100)];}//rac中的kvo-(void)racWithKvo{ @weakify(self)//观察person的name属性[RACObserve(self.person, name) subscribeNext:^(idx) { @strongify(self)self.nameLabel.text= x; }];}//rac中订阅者的取消-(void)racWithSignalDisposable{//rac中最核心的就是信号 1:创建信号 2:订阅信号 3:发送信号//1:创建信号RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {//didSubscribe调用:只有被订阅了,才会调用//didSubscribe作用:发送数据_subscriber = subscriber;//3:发送信号[subscriber sendNext:@"刘亚华"];return[RACDisposable disposableWithBlock:^{NSLog(@"刘亚华被取消了"); }]; }];//2:订阅信号RACDisposable *disposable = [signal subscribeNext:^(idx) {//nextBlock调用:只有发送了数据才会调用//nextBlock作用:接受数据,展示UINSLog(@"%@",x); }];//取消[disposable dispose];}-(void)racWithSignal{//rac中最核心的就是信号 1:创建信号 2:订阅信号 3:发送信号//1:创建信号RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {//didSubscribe调用:只有被订阅了,才会调用//didSubscribe作用:发送数据//3:发送信号[subscriber sendNext:@"刘亚华"];returnnil; }];//2:订阅信号[signal subscribeNext:^(idx) {//nextBlock调用:只有发送了数据才会调用//nextBlock作用:接受数据,展示UINSLog(@"%@",x); }];}
#链式编程
p.p1 {margin:0.0px0.0px0.0px0.0px; font:11.0px Menlo; color:#ffffff}p.p2 {margin:0.0px0.0px0.0px0.0px; font:11.0px Menlo; color: #ffffff; min-height:13.0px}span.s1 {font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s3 {font-variant-ligatures: no-common-ligatures; color: #00afca}span.s4 {font-variant-ligatures: no-common-ligatures; color: #e44448}span.s5 {font-variant-ligatures: no-common-ligatures; color: #93c86a}-(void)run{ NSLog(@"run");}-(void)play{ NSLog(@"play");}-(Person *(^)(CGFloat))run1{return^(CGFloat DIS){ NSLog(@"run1%f",DIS);returnself; };}-(Person *(^)(NSString *))play1{return^(NSString *qiu){ NSLog(@"play1%@",qiu);returnself; };}
文/海绵宝宝不要哭(作者)
原文链接:http://www.jianshu.com/p/1d4248724ad2
著作权归作者所有,转载请联系作者获得授权,并标注“作者”。