RAC基础
RAC作用
- 开发工程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理
- 比如按钮的点击使用
Action
,ScrollView
滚动使用delegate
,属性值改变使用KVO
等系统提供的方式 ReactiveCocoa
为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情和监听的事情放在一起,方便管理(高聚合低耦合)
ReactiveCocoa常见类
- 信号类(RACSiganl),只是表示当前数据改变了,信号内部会发出数据,它本身不具备发送信号能力,而是交给内部一个订阅者去发出
- 默认一个信号都是 冷信号 , 也是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发
- 如何订阅信号: 调用信号
RACSingal
的SubscribeNext
-
RACSubscriber
:表示订阅者的意思,用于发送信号,这是一个协议不是一个类,只要遵守协议,并且实现方法才能成为订阅者。通过creater创建的信号,都有一个订阅者,帮助它发送数据 -
RACDisposable
: 用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发- 使用场景: 不想监听某个信号时,可以通过它主动取消信号订阅
-
RACSubject:
信号提供者,自己可以充当信号,又能发送信号 * 使用场景:通常用来代替代理 -
RACReplaySubject:
重复提供信号类,RACSubject
的子类,如下使用场景- 如果一个信号每被订阅一次,就需要把之前的值重复发送一遍,使用重复提供信号类
- 可以设置
capacity
数量 来限制缓存的value的数量,即只缓冲最新的几个值
RACReplaySubject
与RACSubject
的区别RACReplaySubject
可以先发送信号,再订阅信号,RACSubject
不行
不同信号的订阅方法不一样
RACSubject
执行流程
- RACSubject 被订阅,仅仅是保存订阅者
- RACSubject 发送数据,遍历所有的订阅,调用他们的 nextBlock
1. 创建信号
RACSubject *subject = [RACSubject subject];
2. 订阅信号 ,不同信号的订阅方式不一样, ,RACSuject处理订阅:仅仅是保存订阅者
[subject subscribeNext ^{
}];
3. 发送数据
[subject sendNext@1];
底层实现: 便利所有的订阅者,调用 nextBlock
RAC集合 RACSequence
- 需要先创建结合
NSArray *arr = @[@"12",@"121",@1]
- RAC集合:
RACSquence *seq = arr.rac_sequence
- 把集合转成信号:
RACSignal *signal = sequence.signal ;
- 订阅集合信号,内部会自动遍历所有元素发出来
- 快速方法
[arr.rac_squence.signal subscribrNext:^(id x){}];
- 实现快速遍历 :
RACTupleUnpack(参数名) = x
RAC中的map方法
1.map:映射的意思,目的:把原始值value映射成一个新值
ReactiveCocoa开发中常见方法
- 代替代理:
RACSubject
[self rac_signalForSelector]
: 可以监听某个方法是否被调用
- 代替KVO
[_redView rac_observeKeyPath...]
[_redView rac_valueForkeyPath]
- 监听事件
- 监听按钮点击:
[_btn rac_signalForControlEvent:...]
- 监听按钮点击:
- 代替通知
* [[NSNotificationCenter defaultCenter] rac_addObserverForName:...];
- 监听文本框
[_textField.rac_Signal subscribeNext:^(id x){}];
- 处理当界面有多次请求时,需要都获取数据时,才能展示界面
rac_liftSelector:(SEL)withSignalsFromeArray:(Array)
:点那个传入signals(信号数据)
,每一个 __(Signal)__都至少__sendNext__一次,就会触发第一个 selector的参数方法- 数组:存放信号,当数组中的所有信号发送数据的时候,才会执行
selector
- 方法参数,必须根据数组的信号一一对应,就是 每一个信号发送的数据
- 使用注意: 几个信号,参数有几个参数方法,就有几个参数,每个参数对应发出的数据
总结:
信号类
- 信号类: 表示有数据产生
- 订阅者: 发送数据,执行
nextBlock
不同的信号类,订阅方式不一样
-
RACSignal
-
RACDynamicSignal
->didSubscribe(block)
-
RACSubject
->subscribers(数组)
-
RACReplaySubject
->valuesReceived(数组)
-
RACDynamicSignal
- 创建订阅者,
RACSubscriber
- 执行
didSubscribe(block)
- 创建订阅者,
-
RACSubject :
- 创建订阅者
RACSubscriber
- 保存订阅者
RACReplaySubject
:- 创建订阅者
- 拿到当前创建订阅者,发送之前保存的所有值
- 创建订阅者
不同订阅者,发送数据方式不同
[RACSubscriber sendNext];
执行Block
[RACSubject sendNext] :
遍历自己所有的订阅者,发送数据[RACReplaySubject sendNext]
- 保存发送的值
- 遍历所有订阅者,发送数据
ReactiveCocoa常见宏
RAC(TARGET,....)
, 用来给某个对象的某个属性绑定信号,只要产生信号内容,就会把内容属性赋值RAC(_label,text) = _textField,rac_textSignal
等同于如下代码:
[_textField.rac_textSignal subscribrNext:^(id x){
_label.text = x;
}];
- 监听自己属性
RACObserve(TARGET,KEYPATH)
,只要对象属性已改变就产生信号
- 包装元祖
RACTuple *tuble = RACTuplePac(@1,@2)