我翻譯的RAC4的文檔:
ReactiveCocoa 4 官方文檔翻譯
ReactiveCocoa 4 文檔翻譯:基本操作符(一)
ReactiveCocoa 4 文檔翻譯:基本操作符(二)
ReactiveCocoa 4 文檔翻譯:框架組成介紹
ReactiveCocoa 4 文檔翻譯:兼容Objective-C
ReactiveCocoa 4 文檔翻譯:設(shè)計(jì)指南(一):事件的規(guī)范
ReactiveCocoa 4 文檔翻譯:設(shè)計(jì)指南(二):信號(hào)的規(guī)范
[翻譯]ReactiveCocoa 4 最佳實(shí)踐
下面列的建議為了讓你的RAC相關(guān)的代碼有更好的拓展性、更容易理解、更好的性能。當(dāng)然了,這些只是建議。
只處理適量的數(shù)據(jù)
在一個(gè)事件流已經(jīng)使命結(jié)束后還讓它繼續(xù)存活回浪費(fèi)CPU和內(nèi)存,因?yàn)樵俨僮魉氖录锏臄?shù)據(jù),數(shù)據(jù)也不會(huì)被使用。
如果只需要從信號(hào)或者信號(hào)生產(chǎn)者獲得一定數(shù)量的值,可以使用<code> take </code>或者<code> takeUntil </code>,在指定次數(shù)完成后會(huì)自動(dòng)結(jié)束流。
效果會(huì)非常明顯,因?yàn)檫@會(huì)更快的結(jié)束相關(guān)操作符的工作,默默的節(jié)省了大量工作。
在一個(gè)已知的線程里觀察事件
當(dāng)從未知的代碼接收到信號(hào),很難判斷事件在哪個(gè)線程里。雖然事件會(huì)是線性發(fā)送過(guò)來(lái),有時(shí)也需要更多的保證當(dāng)需要更新UI時(shí)(一定要在主線程里)。
當(dāng)這樣的保證很重要時(shí),<code> observeOn </code> 操作符可以指定事件在什么線程里被接收。
盡可能少的切換線程
雖然上一條這么說(shuō),但是事件應(yīng)該只有在絕對(duì)必要時(shí)才明確指定接收的線程。切換線程會(huì)帶來(lái)延遲和引起CPU計(jì)算量的增加。
正常情況下<code> observeOn </code>應(yīng)該在正要開(kāi)始觀察信號(hào),啟動(dòng)producer或者綁定一個(gè)屬性前才開(kāi)始使用。這保證了事件會(huì)到達(dá)指定的線程而不會(huì)帶來(lái)多余的多線程處理。
在信號(hào)生產(chǎn)者內(nèi)部捕捉副作用
因?yàn)樾盘?hào)生產(chǎn)者是根據(jù)需要開(kāi)始工作,每個(gè)返回信號(hào)生產(chǎn)者的方法或者函數(shù)都應(yīng)該保證在內(nèi)部就捕捉好副作用,而不是作為調(diào)用時(shí)的一個(gè)部分。
比如,有一個(gè)這樣的函數(shù):
<pre><code>
func search(text: String) -> SignalProducer<Result, NetworkError>
</code></pre>
… 不應(yīng)該立即開(kāi)始一次搜索。
正確的做法是,被返回的信號(hào)生產(chǎn)者應(yīng)該在每次啟動(dòng)時(shí)執(zhí)行一次搜索。這也意味著如果這個(gè)生產(chǎn)者從沒(méi)被啟動(dòng)(started),一次搜索也不會(huì)執(zhí)行。
通過(guò)共享一個(gè)生產(chǎn)者的信號(hào)來(lái)共享生產(chǎn)者的副作用
如果多個(gè)觀察者都對(duì)一個(gè)信號(hào)生產(chǎn)者的結(jié)果感興趣,為每個(gè)觀察者調(diào)用一次start意味著和生產(chǎn)者相關(guān)聯(lián)的工作也會(huì)被多次執(zhí)行而且可能不會(huì)有一致的結(jié)果。
如果:
- 觀察者們需要得到相同的結(jié)果
- 觀察者互相知道對(duì)方的存在,或者
- 啟動(dòng)信號(hào)生產(chǎn)者的代碼知道每個(gè)觀察者
… 只啟動(dòng)信號(hào)生產(chǎn)者一次是更合適的做法,然后所有的觀察者共享那個(gè)信號(hào)的結(jié)果給所有的觀察者,通過(guò)在傳遞給<code> startWithSignal </code>方法的閉包里添加觀察。
用操作符管理生命周期比通過(guò)disposal手動(dòng)管理更好
雖然利用從<code> start </code>返回的disposable取消一個(gè)信號(hào)生產(chǎn)者非常容易,顯式的使用disposable可以快速的清理資源并且讓代碼整潔。
但是總是有更高端的操作符可以替換這些手動(dòng)的disposal:
- <code> take </code>可以在接收到指定次數(shù)的值后自動(dòng)終結(jié)流
- <code> takeUntil </code>可以在指定某個(gè)事件發(fā)生后自動(dòng)終結(jié)信號(hào)或者信號(hào)生產(chǎn)者(比如當(dāng)一個(gè)"取消"按鈕點(diǎn)擊)
- 屬性和<code><~</code>操作符可以用于綁定一個(gè)信號(hào)或者信號(hào)生產(chǎn)者的結(jié)果,直到終結(jié)或者直到屬性被銷毀。這可以替代收到觀察一個(gè)值查并且設(shè)置到某個(gè)地方
歡迎關(guān)注我的微博:@沒(méi)故事的卓同學(xué)