主要是为了总结学习RAC的过程中,遇到的一些困惑点,一些阅读的参考资料,文笔也不是很好。建议大家学习RAC参考文章:
https://github.com/ReactiveCocoa/ReactiveCocoa/tree/master/Documentation以及花瓣工程师的一篇很棒的文章:
http://limboy.me/ios/2014/06/06/deep-into-reactivecocoa2.html
把自己的学习心得写了一个小demo,放在了github上面,欢迎一起学习交流:
https://github.com/lihei12345/RACNetwokDemo
=====================================================================
一. ReactiveCocoa
monad术语: “It’s a specific way of chaining operations together. ” ,
http://stackoverflow.com/questions/44965/what-is-a-monad
1. RACSignal / RACSequence:
RACSignal与RACSequence是可以相互转换的。RACSignal是push-driven的,RACSequence是pull-driven的。push-driven的意思是在signal创建的时候,signal的values还没有定义,在稍后的某个时间点上,values才能准备好,比如,网络请求结果或者用户输入产生的values。而pull-driven的意思是在sequence创建的时候values就已经被定义了,可以从sequence中把这些values one-by-one 查询出来。
1). RACSequence -> RACSignal :
[sequence signal]或者[sequence signalWithScheduler:]
2). RACSignal -> RACSequence :
[[signal toArray] rac_sequence],注意-toArray方法是阻塞式的,一直到signal completes之后才会继续。或者使用[signal sequence]方法,这个方法尽管不会等待signal completes才会继续,但是需要signal至少有一个value,所以当signal一个value都没有的时候,仍然会阻塞。
在实际中,RACSequence使用的并不多,一般就是用来操作Cocoa collections,比如NSArray,NSSet, NSDictionary,NSIndexSet。我们最感兴趣和最常用的还是RACSignal,因为signals代表着未来的values,这个才是我们所需要的。
2. RACSubject / RACReplaySubject:
RACSubject用来衔接RAC代码与非RAC代码,RACReplaySubject,“A replay subject saves the values it is sent (up to its defined capacity) and resends those to new subscribers. It will also replay an error or completion.”。与RACSubject不同的是,RACReplaySubject会缓存它send的值,新的subscribers可以收到subscribe之前已经产生的值。并且可以通过设置RACReplaySubject的capacity数量来限制缓存的value的数量,即只缓充最新的几个值。
3. RACMulticastConnection:
"The main purpose of RACMulticastConnection is to subscribe to a base signal, and then multicast that subscription to any number of other subscribers, without triggering the base signal's side effects multiple times. RACMulticastConnection accomplishes this by sending values to a private RACSubject, which is exposed via the connection's signal property. Subscribers attach to the subject (which doesn't cause any side effects), and the connection forwards all of the base signal's events there."
注意没有RACMulticastConnection的情况下,每次subscribe发生时,都会连续触发到base signal(即源signal)发生side effect,订阅是一级一级向上传递的,直到base signal,可以参考RACSignal的操作符的实现。
4. RACSignal replay / replayLast / replayLazily:
用于避免subscribe产生多次side effect,查看源代码这三个方法的大致调用过程:
生成[RACReplaySubject subject] -> 使用subject调用[RACSignal multicast:] -> 使用multicast:返回的connection来调用 [RACMulticastConnection connect] -> 返回[RACMulticastConnection signal]
与publish的区别,publish在调用[RACSignal multicast:]时使用的是subject是RACSubject,即不会产生value的缓存。
1). replay -> hot signal,会立即subscribe,并且不限制RACReplaySubject的capacity数量
2). replayLast -> hot signal,会立即subscribe,与replay的区别,只是限制RACReplaySubject缓存的capacity为1,即只保留最新的一个value。
3). replay