- Reactive Cocoa(RAC)是一个支持FRP(函数响应式编程)的框架;详细的就不再多介绍了,直接说说在我们开发中一些RAC的常见用法;
替换代理
场景:一个View中放着一个Button 当我们点击Button的时候,视图控制器如果需要知道这个Button被点击了,一般我们需要写一个代理去通知控制器。 在RAC中我们不需要写代理,我们需要这样做: [[_redView rac_signalForSelector:@Selector(btnClicked:)]subscribeNext:^(id x){ NSLog(@"View中的按钮被点击了"); }]; //这样做 是将一个方法转换成信号 复制代码
KVO
监听一些属性的变化,只要属性改变就会调用,并把改变的值传递给你。 如: @property(noatomic,assign) int age; [[self rac_valueForKeyPath:@"age" observer:nil] subscribeNext:^(id x ){ NSLog(@"%@",x); }]; //模拟一个事件 触摸屏幕 就让age自增 -(void)touchesBegin:(NSSet*)touches WithEvent:(UIEvent*)event{ age++; } 复制代码
监听事件
监听一个按钮的点击事件: [[_btn rac_signalForControlEvents:UIControlEventsTouchUpInside] subscribeNext:^(id x ){ NSLog(@"点击了按钮");//在其中 我们做以前单独拿出去写的事件方法一样的事情 }]; 复制代码
监听通知
如监听键盘弹出: [[NSNotificationCenter defaultCenter] rac_addObserverForName: UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x ){ NSLog(@"键盘弹出"); }]; 复制代码
监听文本框文字改变
[_textField.rac_textSignal subscribeNext:^(id x){ NSLog(@"%@",x);//这里的X就是文本框的文字 }]; 复制代码
需要几个地方数据请求都完成以后再刷新界面的需求
RACSignal*signalA = [RACSignal createSignal:^RACDisposable *(idsubscriber){ NSLog(@"数据请求1"); [subscriber sendNext:@"数据请求1请求下来的数据"]; return nil; }]; RACSignal*signalB = [RACSignal createSignal:^RACDisposable *(id subscriber){ NSLog(@"数据请求2"); [subscriber sendNext:@"数据请求2请求下来的数据"]; return nil; }]; //将两个信号组合 如果两个都有信号发出 则执行回调方法 [self rac_liftSelector:@Selector(updateUI:new:) withSignalFromArray:@[signalA,signalB]]; //在这里需要注意 数组中有几个参数 回调方法里也应该有几个参数! 复制代码
常用的宏
1. [_textField.textSignal subscribeNext:^(id x ){ self.label.text = x; }]; //把一个对象的某个属性绑定成一个信号,只要发出信号,就会把信号的内容给对象的属性赋值。 上面的三行代码用下面这个宏代替: RAC(self.label.text) = _textField.rac_textSignal; 其中RAC()括号中 是需要你填写的目标对象的属性; 复制代码
2.KVO (快速监听某个对象的某个属性改变) 如:监听当前视图控制器中心点的变化 [RACObserver (self.view,center) subscribeNext:^(id x){ }]; 复制代码
3. Block中使用self 避免循环引用的出现 @weakify(self);//将self转换成弱指针 RACSignal*signalB = [RACSignal createSignal:^RACDisposable *(idsubscriber){ @strongify(self);//转换成强指针 避免在block中被释放 NSLog(@"%@",self.view); return nil;}]; 复制代码
4.元组 //快速组装元组 RACTuple*tuple = RACTuplePack(@1,@3); NSLog(@"%@",tuple); //快速解析元组 RACTupleUnPack(NSNumber*num1,NSNumber*num2) = tuple; //宏的参数表示你需要把这个元组解析成什么类型的数据 复制代码
最近看到一篇写的很详细的:
[http://limboy.me/tech/2013/12/27/reactivecocoa-2.html]