一、概述
ReactiveCocoa由两大主要部分组成:signals(RACSignal)和sequences(RACSequence)。
signal 和sequence都是streams,他们共享很多相同的方法。
ReactiveCocoa在功能上做了语义丰富
一致性强的一致性设计:signal是push驱动的stream,sequence是pull驱动的stream。
RACSignal
异步控制或者事件驱动的数据源:
Cocoa编程中大多数时候会关注用户事件或应用状态改变产生的影响链式依赖操作:
网络请求是最常见的依赖性样例,前一个对server的请求完成后,下一个请求才能构建。并行独立操作:
独立的数据集要并行处理,随后还要把他们合成一个最终结果。这在Cocoa中很常见,特别是涉及到同步动作时。Signal会触发它们的subsciber三种不同类型的事件:
- 下一个 事件从stream中提供一个新值。不像Cocoa集合,它是完全可用的,甚至一个signal可以包含nil。
- 错误 事件会在一个signal结束之前被标示出来这里有一个错误。这种事件可能包含一个NSError对象来标示什么发生了错误。错误必须被特殊处理——错误不会被包含在stream的值里面。
- 完成 事件标示signal成功结束,不会再有新的值会被加入到stream当中。完成事件也必须被单独控制——它不会出现在stream的值里面。
一个signal的生命由很多下一个(next)事件和一个错误(error)或完成(completed)事件组成(后两者不同时出现)。
RACSequence
- 简单集合转换: 你会痛苦的发现Foundation库中没有类似map和filter、fold、reduce等高级函数。
Sequence是一种集合,很像NSArray。但和数组不同的是,一个sequence里的值默认是延迟加载的(只有需要的时候才加载),这样的话如果sequence只有一部分被用到,那么这种机制就会提高性能。像Cocoa的集合类型一样,sequence不接受nil值。
RACSequence允许任意Cocoa集合,统一且显式地进行操作。
RACSequence *normalizedLongWords = [[words.rac_sequence
filter:^ BOOL (NSString *word) {
return [word length] >= 10;
}]
map:^(NSString *word) {
return [word lowercaseString];
}];
二、简单比较
RAC 与 KVO
Key-Value Observing是Cocoa所有魔法的核心,它被广泛应应用在ReactiveCocoa对于属性变化的影响动作中。然而KVO用起来既不简单也不开心:它的API有很多过度设计的参数,以及缺乏方便的block方式调用。
RAC 与 Bingdings
Bindings也是黑魔法。
虽然对 OS X控制的要点就是Bindings,但是它的意义在近年来越来越没那么重要了,因为焦点已经转移到了iOS和UIKit,这些Bingdings不支持的东西身上。Bingdings替代了大量的模版化的无趣代码,允许在Interface Builder 中完成代码,但严格上说还是比较有局限性的,并且无法debug。RAC提供了一种简洁易懂、扩展性强的以代码为基础的API来运行在iOS,目标就是取代所有在OS X能用Bingdings实现的神奇功能。
三、简单使用
先上demo ReactiveCocoaDemo