我翻译的RAC4的文档:
ReactiveCocoa 4 官方文档翻译
ReactiveCocoa 4 文档翻译:基本操作符(一)
ReactiveCocoa 4 文档翻译:基本操作符(二)
ReactiveCocoa 4 文档翻译:框架组成介绍
ReactiveCocoa 4 文档翻译:兼容Objective-C
ReactiveCocoa 4 文档翻译:设计指南(一):事件的规范
ReactiveCocoa 4 文档翻译:设计指南(二):信号的规范
[翻译]ReactiveCocoa 4 最佳实践
下面列的建议为了让你的RAC相关的代码有更好的拓展性、更容易理解、更好的性能。当然了,这些只是建议。
只处理适量的数据
在一个事件流已经使命结束后还让它继续存活回浪费CPU和内存,因为再操作它的事件里的数据,数据也不会被使用。
如果只需要从信号或者信号生产者获得一定数量的值,可以使用<code> take </code>或者<code> takeUntil </code>,在指定次数完成后会自动结束流。
效果会非常明显,因为这会更快的结束相关操作符的工作,默默的节省了大量工作。
在一个已知的线程里观察事件
当从未知的代码接收到信号,很难判断事件在哪个线程里。虽然事件会是线性发送过来,有时也需要更多的保证当需要更新UI时(一定要在主线程里)。
当这样的保证很重要时,<code> observeOn </code> 操作符可以指定事件在什么线程里被接收。
尽可能少的切换线程
虽然上一条这么说,但是事件应该只有在绝对必要时才明确指定接收的线程。切换线程会带来延迟和引起CPU计算量的增加。
正常情况下<code> observeOn </code>应该在正要开始观察信号,启动producer或者绑定一个属性前才开始使用。这保证了事件会到达指定的线程而不会带来多余的多线程处理。
在信号生产者内部捕捉副作用
因为信号生产者是根据需要开始工作,每个返回信号生产者的方法或者函数都应该保证在内部就捕捉好副作用,而不是作为调用时的一个部分。
比如,有一个这样的函数:
<pre><code>
func search(text: String) -> SignalProducer<Result, NetworkError>
</code></pre>
… 不应该立即开始一次搜索。
正确的做法是,被返回的信号生产者应该在每次启动时执行一次搜索。这也意味着如果这个生产者从没被启动(started),一次搜索也不会执行。
通过共享一个生产者的信号来共享生产者的副作用
如果多个观察者都对一个信号生产者的结果感兴趣,为每个观察者调用一次start意味着和生产者相关联的工作也会被多次执行而且可能不会有一致的结果。
如果:
- 观察者们需要得到相同的结果
- 观察者互相知道对方的存在,或者
- 启动信号生产者的代码知道每个观察者
… 只启动信号生产者一次是更合适的做法,然后所有的观察者共享那个信号的结果给所有的观察者,通过在传递给<code> startWithSignal </code>方法的闭包里添加观察。
用操作符管理生命周期比通过disposal手动管理更好
虽然利用从<code> start </code>返回的disposable取消一个信号生产者非常容易,显式的使用disposable可以快速的清理资源并且让代码整洁。
但是总是有更高端的操作符可以替换这些手动的disposal:
- <code> take </code>可以在接收到指定次数的值后自动终结流
- <code> takeUntil </code>可以在指定某个事件发生后自动终结信号或者信号生产者(比如当一个"取消"按钮点击)
- 属性和<code><~</code>操作符可以用于绑定一个信号或者信号生产者的结果,直到终结或者直到属性被销毁。这可以替代收到观察一个值查并且设置到某个地方
欢迎关注我的微博:@没故事的卓同学