RAC的基础介绍

RAC基础

RAC作用

  1. 开发工程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理
  2. 比如按钮的点击使用ActionScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式
  3. ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情和监听的事情放在一起,方便管理(高聚合低耦合)

ReactiveCocoa常见类

  • 信号类(RACSiganl),只是表示当前数据改变了,信号内部会发出数据,它本身不具备发送信号能力,而是交给内部一个订阅者去发出
  • 默认一个信号都是 冷信号 , 也是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发
  • 如何订阅信号: 调用信号RACSingalSubscribeNext

  • RACSubscriber:表示订阅者的意思,用于发送信号,这是一个协议不是一个类,只要遵守协议,并且实现方法才能成为订阅者。通过creater创建的信号,都有一个订阅者,帮助它发送数据

  • RACDisposable: 用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发

    1. 使用场景: 不想监听某个信号时,可以通过它主动取消信号订阅
  • RACSubject:信号提供者,自己可以充当信号,又能发送信号 * 使用场景:通常用来代替代理

  • RACReplaySubject:重复提供信号类, RACSubject 的子类,如下使用场景

    1. 如果一个信号每被订阅一次,就需要把之前的值重复发送一遍,使用重复提供信号类
    2. 可以设置capacity数量 来限制缓存的value的数量,即只缓冲最新的几个值

  • RACReplaySubjectRACSubject的区别
    1. RACReplaySubject可以先发送信号,再订阅信号,RACSubject不行

不同信号的订阅方法不一样

RACSubject

执行流程
  1. RACSubject 被订阅,仅仅是保存订阅者
  2. RACSubject 发送数据,遍历所有的订阅,调用他们的 nextBlock
1. 创建信号
    RACSubject *subject = [RACSubject subject];
2. 订阅信号 ,不同信号的订阅方式不一样,  ,RACSuject处理订阅:仅仅是保存订阅者
    [subject subscribeNext ^{
       
    }];
3. 发送数据
   [subject sendNext@1]; 

底层实现: 便利所有的订阅者,调用 nextBlock

RAC集合 RACSequence

  1. 需要先创建结合 NSArray *arr = @[@"12",@"121",@1]
  2. RAC集合: RACSquence *seq = arr.rac_sequence
  3. 把集合转成信号: RACSignal *signal = sequence.signal ;
  4. 订阅集合信号,内部会自动遍历所有元素发出来
  5. 快速方法 [arr.rac_squence.signal subscribrNext:^(id x){}];
  6. 实现快速遍历 : RACTupleUnpack(参数名) = x
RAC中的map方法

1.map:映射的意思,目的:把原始值value映射成一个新值

ReactiveCocoa开发中常见方法

  1. 代替代理:RACSubject
    • [self rac_signalForSelector] : 可以监听某个方法是否被调用
  2. 代替KVO
    • [_redView rac_observeKeyPath...]
    • [_redView rac_valueForkeyPath]
  3. 监听事件
    • 监听按钮点击: [_btn rac_signalForControlEvent:...]
  4. 代替通知
   * [[NSNotificationCenter defaultCenter] rac_addObserverForName:...];
  1. 监听文本框
    • [_textField.rac_Signal subscribeNext:^(id x){}];
  2. 处理当界面有多次请求时,需要都获取数据时,才能展示界面
    • rac_liftSelector:(SEL)withSignalsFromeArray:(Array):点那个传入signals(信号数据),每一个 __(Signal)__都至少__sendNext__一次,就会触发第一个 selector的参数方法
    • 数组:存放信号,当数组中的所有信号发送数据的时候,才会执行 selector
    • 方法参数,必须根据数组的信号一一对应,就是 每一个信号发送的数据
    • 使用注意: 几个信号,参数有几个参数方法,就有几个参数,每个参数对应发出的数据

总结:

信号类

  • 信号类: 表示有数据产生
  • 订阅者: 发送数据,执行nextBlock
不同的信号类,订阅方式不一样
  • RACSignal

  • RACDynamicSignal -> didSubscribe(block)

  • RACSubject -> subscribers(数组)

  • RACReplaySubject -> valuesReceived(数组)

  • RACDynamicSignal

    1. 创建订阅者,RACSubscriber
    2. 执行 didSubscribe(block)
  • RACSubject :

    1. 创建订阅者 RACSubscriber
    2. 保存订阅者
    • RACReplaySubject:
      1. 创建订阅者
      2. 拿到当前创建订阅者,发送之前保存的所有值
不同订阅者,发送数据方式不同
  1. [RACSubscriber sendNext]; 执行 Block
  2. [RACSubject sendNext] : 遍历自己所有的订阅者,发送数据
  3. [RACReplaySubject sendNext]
    • 保存发送的值
    • 遍历所有订阅者,发送数据

ReactiveCocoa常见宏

  1. RAC(TARGET,....), 用来给某个对象的某个属性绑定信号,只要产生信号内容,就会把内容属性赋值 RAC(_label,text) = _textField,rac_textSignal 等同于如下代码:
     [_textField.rac_textSignal subscribrNext:^(id x){
       _label.text = x;
     }];
  1. 监听自己属性
  • RACObserve(TARGET,KEYPATH),只要对象属性已改变就产生信号
  1. 包装元祖 RACTuple *tuble = RACTuplePac(@1,@2)

基础使用Demo

Demo

转载于:https://my.oschina.net/zboy/blog/1802392

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值