[翻译]ReactiveCocoa 4 最佳实践

原文 :Design Guidelines

我翻译的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>操作符可以用于绑定一个信号或者信号生产者的结果,直到终结或者直到属性被销毁。这可以替代收到观察一个值查并且设置到某个地方

欢迎关注我的微博:@没故事的卓同学

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容