我翻译的RAC4的文档:
ReactiveCocoa 4 官方文档翻译
ReactiveCocoa 4 文档翻译:基本操作符(一)
ReactiveCocoa 4 文档翻译:基本操作符(二)
ReactiveCocoa 4 文档翻译:框架组成介绍
ReactiveCocoa 4 文档翻译:兼容Objective-C
ReactiveCocoa 4 文档翻译:设计指南(一):事件的规范
ReactiveCocoa 4 文档翻译:设计指南(二):信号的规范
[翻译]ReactiveCocoa 4 最佳实践
Signal的规范
一个信号是始终打开的流,流按照事件的规范。(ReactiveCocoa 4 文档翻译--设计指南(一):事件的规范)
信号是一个引用类型。因为每个信号都有自己的身份,换句话说,每个信号都有自己的生命周期,最终通常会终止。一旦被终止,信号不能被重启。
信号一被实例化就开始工作
<code>Signal.init</code>立即就会执行传递过来的闭包。意味着副作用可能在初始化器返回前就发生。
也可能在初始化器返回前就发送事件。然而,因为这个时候任何观察者都不能被添加,这个时候发出的事件都是不会被接收到。
观察一个信号不会有副作用
当一个信号的观察者被添加或者被移除时,和信号关联的操作不会被启动或者停止。所以观察方法不会有副作用。
一个信号的副作用只能通过一个终结事件来停止。
同一个信号的所有观察者同时按照相同顺序接收到事件
因为观察行为不会有副作用,一个信号不会为不同的观察者自定义不同的事件。
当一个事件从信号发出时,它会被同步的分发给所有观察者,这个机制和NSNotificationCenter发送通知有点像。
换句话说,不存在不同的观察者对应不同的事件流。所有的观察者看到的都是同一个事件流。
这条规则只有一种意外情况:在一个信号终止后添加一个观察者会产生一个Interrupted事件发送给这个观察者。
信号会一直被保持直到所有观察者都被释放
即使信号源(caller)不再有一个指针指向信号(does not maintain a reference):
- <code>Signal.init</code>创建的信号会一直存在直到生成器闭包(generator closure)释放了作为参数的观察者
- <code>Signal.pipe</code>创建的信号会一直存在直到它返回的观察者被释放
这保证了和信号关联的长耗时的工作不会被提前销毁。
注意一下,可以在收到终结事件收到前提前释放信号。但是应该避免这么做,这会导致内存泄露,但是有时为了让终结不可用会这么做。
终止事件清除信号相关的资源
当一个终结事件从信号发出,所有的观察者都会被释放,所有用于产生事件的资源都应该被清除。
最简单的保证正确的清楚资源是利用生成器闭包(generator closure)返回的disposable,当终止发生时它会被处理。disposable要负责释放资源,关闭文件句柄,取消网络请求,或者其他任何和工作想关联的东西。(disposable的内容可以查看:ReactiveCocoa 4 文档翻译:框架组成介绍)
SignalProducer的规范
一个信号生产者(signal producer)就像一份创造信号的食谱。信号生产者不会自己开始工作,在生成一个信号后开始工作。
信号生产者就是一份声明怎么创建信号,是值类型,所以没有内存管理的事情要担心。
信号生成者根据创建信号的要求开始工作
<code> start </code>和 <code> startWithSignal </code>方法会都会生成一个信号(隐式和显式)。在初始化信号后,传递给<code> SignalProducer.init </code>的闭包会被执行,在有观察者添加后开启事件流。
虽然生产者自己不负责工作的执行,但是我们也会说“starting”和“canceling” 一个生产者。这两个词指产生一个要开始工作的信号,和释放那个信号以停止工作。
一个生产者可以被开始很多次,相关联的工作也会被执行同样多次。
每个生产的信号可能在不同的时间发送不同的事件
因为信号生产者根据需要开始工作,所以可能每次执行相关的观察者会不同,这些观察者可能接收到完全不同的事件顺序。
换句话说,每次生产者启动后生成的事件可能完全不同或者顺序完全不同。
尽管如此,每个信号生产者的每次执行后会按照事件的规范。(ReactiveCocoa 4 文档翻译:设计指南(一):事件的规范)
信号的操作符可以在迁移后使用在信号生产者上
因为信号和信号生产者的紧密关系,利用<code> lift </code>方法将使用在信号上的操作符向上迁移就可以使用在信号生产者上。
<code> lift </code>会将这个操作符的行为使用在每个信号生成者启动后产生的信号上。
释放一个生产的信号会中断(interrupt)它
当一个信号生产者通过 <code> start </code>or <code> startWithSignal </code>方法启动, 一个 <code> Disposable </code>会被自动创建并且传回。
释放它会中断信号生产者,从而取消未执行的工作并且发送一个Interrupted事件给所有观察者,也会释放所有在<code> SignalProducer.init </code>时被添加进<code> CompositeDisposable </code>的东西。
注意释放一个生产的信号不会影响到其他有这个信号生产者产生的信号。
欢迎关注我的微博:@没故事的卓同学