什么是RAC?
RAC是ReactiveCocoa的简称,是Github开源的一个应用于iOS和OS开发的第三方框架,具有函数式编程跟响应式编程的特性,也可称其为函数响应式编程。
RAC的作用
- 要了解它的作用,先要了解响应式编程:在事件发生的时候立刻做出响应,比如
a=b+c
,当b
或者c
发生变化的时候,a
的值能够立刻改变,类似于蝴蝶效应。一般来说,实现这种逻辑需要用到KVO去监听b跟c
,然后去重新计算a
,而使用RAC就不用去管中间的过程而直接去响应事件。 - 很方便的处理开发中常用的事件,比如Target-Action,delegate,KVO,Notification等等,它把监听事件跟处理事件的代码放到一起,无需跳到对应的方法中,代码简洁且利于管理。
运行机制
总的来说,RAC是围绕signal(信号)来运行的,基本流程就是信号三部曲:
- 创建/获取信号(冷信号)
- 订阅信号 (热信号)
- 发送信号
//1.创建信号,点进去可以看到:
// 它其实创建了一个RACDynamicSignal信号,并保存了didSubscribe这个Block
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"创建了信号");
//3.发送信号,点进去可以看到
// 执行之前所保存的nextBlock
[subscriber sendNext:@"ZM"];
NSLog(@"发送了信号");
return [RACDisposable disposableWithBlock:^{
//取消订阅时的回调
}];
}];
//2.订阅信号,点进去可以看到:
// 创建了一个RACSubscriber订阅者,并保存了一个nextBlock,
// 同时执行之前所保存的didSubscribe这个Block
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"订阅了信号");
NSLog(@"%@",x);
}];

这边贴上一张图来更好的帮助我们理解其中的实现原理

首先在创建信号的时候,带进去一个已经订阅的Block(didSubscribe),把它保存在信号中,并没有执行;
在订阅信号的时候,带进去一个发送信号的Block(nextBlock),然后创建一个订阅者(RACSubscriber对象),订阅者会把nextBlock进行保存,接着执行之前信号保存的didSubscribe这个Block,并将订阅者传递过去;
然后在didSubscribe回调里面,由订阅者发送信号,也就是执行之前保存的nextBlock;
最后在nextBlock(订阅回调)里面监听到发送的内容。
网友评论