背景
熟悉MVVM设计模式的朋友,想必对数据绑定Data Binding是相当了解了;MVVM的设计模式让VM(ViewModel)专注于数据处理,而所有的有关View的操作都在ViewController中处理,ViewController不仅要随时传递View层的用户交互事件,同时还要时刻监听ViewModel快递的数据,以便及时告诉View刷新数据并做出相应的UI响应。若不借助于第三方库,我们仅用iOS系统提供的如:Target-Action、KVO、NSNotification等等来实现MVVM的话,那精简的代码(有时虽然并不能减少代码量,但可读性和易维护性得以提高了)和Lightweight的ViewController的就很难实现了,因此,RAC(ReactiveCocoa)应运而生。
简介
RAC的出现是受函数响应式编程FRP(Functional Reactive Programming)的启发,FRP是一种使用函数编程的构建块的响应式编程的编程思想,提供用于编写和转换值流的API,有兴趣的可以去这里(JS)看看。
源码
RAC是通过提供捕获当前和未来值的信号Signal(RACSignal)来描述值流streams of values的,每个Signal都包含着一个当前的或未来的Value,这个Value可能为空也可能为非空,要想拿到这个Value则必须订阅Subscribe这个Signal,订阅的方式有subscribeNext:、subscribeCompleted:等等。Signal就像期刊App中的期刊杂志,Subscribe Signal就像是在App中订阅了期刊杂志,订阅的内容的内容不仅可以自己看,还可以分享给你指定的人看,在订阅过程中Signal还可以被修改map、过滤filter、组合combine、链chain。
__block int i = 0;
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
i += 1;
DLog(@"A1 x: %d", i);
[subscriber sendNext:@(i)];
[subscriber sendCompleted];
return nil];
}];
