背景
熟悉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];
}];