博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中RAC的使用
阅读量:6183 次
发布时间:2019-06-21

本文共 2449 字,大约阅读时间需要 8 分钟。

  • 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 *(id 
subscriber){
  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 *(id 
subscriber){  @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]

转载于:https://juejin.im/post/5a30f70c6fb9a0451a7660f2

你可能感兴趣的文章
天下无难试之HashMap面试刁难大全
查看>>
IP地址自动封与解封的shell脚本
查看>>
ubuntu 系统环境配置文件的区别
查看>>
精通visual c++指纹模式识别系统算法及实现
查看>>
博客园自定义页面风格设计 后续篇(页面设计模式及代码高亮 鼠标点击效果升级)...
查看>>
[知识盲点] 为function添加值为function的属性
查看>>
Emacs for Windows use TRAMP
查看>>
ssh登录的调试方法和常见问题
查看>>
PHP 7.3 比 PHP 7.0 快 22%,即将进入特性冻结阶段
查看>>
Java 9 文章集锦
查看>>
案例丨数据驱动的发现页最低成本改版
查看>>
普通用户竟这样执行xp_cmdshell存储过程!
查看>>
Visualize Famous Campus in China
查看>>
C#给PDF文档添加文本和图片页眉
查看>>
为Exchange Server 2010服务器申请证书
查看>>
httpd之Forbidden问题解决
查看>>
输入的字符串分割后 ,通过查询语句查询结果集
查看>>
三台linux服务器相互ssh 无密码验证登陆
查看>>
.htaccess文件的作用(访问控制)
查看>>
了解你所不知道的SMON功能(四):维护col_usage$字典基表
查看>>