我翻譯的RAC4的文檔
ReactiveCocoa 4 官方文檔翻譯
ReactiveCocoa 4 文檔翻譯:基本操作符(一)
ReactiveCocoa 4 文檔翻譯:基本操作符(二)
ReactiveCocoa 4 文檔翻譯:框架組成介紹
ReactiveCocoa 4 文檔翻譯:兼容Objective-C
ReactiveCocoa 4 文檔翻譯--設(shè)計(jì)指南(一):事件的規(guī)范
ReactiveCocoa 4 文檔翻譯:設(shè)計(jì)指南(二):信號的規(guī)范
[翻譯]ReactiveCocoa 4 最佳實(shí)踐
本文將以整個(gè)框架的高度介紹RAC框架中的主要組成元素全释,嘗試說明它們是怎么組成在一起工作和各自的職責(zé)。這會(huì)有助于你學(xué)習(xí)新模塊和查找相關(guān)詳細(xì)說明的文檔野芒。
關(guān)于RAC的例子和應(yīng)該怎么使用可以查看這兩個(gè)文檔:ReactiveCocoa 4 官方文檔翻譯:ReadMe 或者 Design Guidelines考润。
事件:Events
一個(gè)事件, 用<code> Event </code>類型表示, 表示某些事情已經(jīng)發(fā)生萌庆。 在RAC中事件是傳播(center-piece of communication)的核心。 一個(gè)事件可能是button的一次點(diǎn)擊,從API返回的一些信息肮疗,一個(gè)錯(cuò)誤的發(fā)生,或者一個(gè)長時(shí)間操作完成了扒接。無論如何伪货,一些東西產(chǎn)生事件,然后通過signal發(fā)送給每個(gè)訂閱這個(gè)signal的觀察者钾怔。
<code> Event </code>是一個(gè)枚舉類型碱呼,可能有四種值(Next中有值,其他三種表示結(jié)束):
- <code> Next </code>代表有一個(gè)新的值從源產(chǎn)生宗侦。
- <code> Failed </code>說明在信號源完成前發(fā)生了一個(gè)錯(cuò)誤愚臀。事件會(huì)被當(dāng)做一個(gè)類型為<code> ErrorType </code>的參數(shù),一種在事件中聲明過的表示已知錯(cuò)誤的類型矾利。如果這個(gè)錯(cuò)誤沒有被聲明許可過姑裂,可以用<code> NoError </code>表示。
- <code> Completed </code>說明事件已經(jīng)成功結(jié)束男旗。不會(huì)再有值發(fā)送出來舶斧。
- <code> Interrupted </code>說明事件被取消了,意味著操作既沒有成功也沒有失敗察皇。
信號:Signals
一個(gè)信號, 用 <code> Signal </code>類型表示,是一連串隨著時(shí)間發(fā)出的可以被觀察的事件茴厉。
信號通常用來表示事件流正在發(fā)出,比如通知什荣,用戶的輸入等矾缓。每當(dāng)動(dòng)作被執(zhí)行或者數(shù)據(jù)已經(jīng)接受,事件們就會(huì)通過signal發(fā)出溃睹,signal會(huì)把它們推送給每個(gè)觀察者而账。所有的觀察者都會(huì)同時(shí)接受到事件。
用戶如果想要接收它們的事件必須observe(觀察)這個(gè)signal因篇。觀察一個(gè)信號不會(huì)觸發(fā)其他副作用泞辐。換句話說笔横,事件是源驅(qū)動(dòng),基于推送咐吼,觀察者在整個(gè)生命周期里不會(huì)受到到任何影響吹缔。當(dāng)觀察一個(gè)信號時(shí),用戶只能按照順序處理信號里的事件锯茄。不能隨意訪問信號里的事件厢塘。
信號可以被操作符操作。常用的操作一個(gè)信號的有filter肌幽,map和reduce晚碾,zip可以一次處理多個(gè)信號源。操作符只能在Next事件中才能使用喂急。(具體操作符可以參考我翻的這篇:ReactiveCocoa 4 文檔翻譯:基本操作符)
信號的整個(gè)生命周期有一組Next事件組成格嘁,最后是一個(gè)終結(jié)事件,可能是Failed, Completed, 或者Interrupted中的任一個(gè)廊移。終結(jié)事件沒有被包含在事件的值里糕簿,他們需要被單獨(dú)處理。
管道:Pipes
一個(gè)管道狡孔,通過 <code>Signal.pipe()</code>創(chuàng)建懂诗。一個(gè)可以被手動(dòng)控制的信號。
這個(gè)方法返回一個(gè)信號和一個(gè)observer苗膝⊙旰悖可以控制信號發(fā)送事件給觀察者。這個(gè)在將非RAC的代碼轉(zhuǎn)變到信號世界里特別有用荚醒。
比如芋类,可以不用在block的回調(diào)里處理業(yè)務(wù)邏輯,將blocks簡化成發(fā)送事件給觀察者界阁。同時(shí)信號可以被返回侯繁,隱藏回調(diào)里的具體實(shí)現(xiàn)。
信號生產(chǎn)者:Signal Producers
一個(gè)信號生產(chǎn)者,以 <code> SignalProducer </code>類型表示,創(chuàng)建信號并且產(chǎn)生副作用泡躯。
可以用來表示一組操作或者任務(wù)贮竟,比如網(wǎng)絡(luò)請求,每次<code> start()</code>調(diào)用后會(huì)創(chuàng)建一個(gè)新的操作较剃,允許發(fā)起者觀察結(jié)果咕别。通過<code> startWithSignal()</code>可以訪問到產(chǎn)生的信號,允許被多次觀察写穴。
因?yàn)?lt;code> start()</code>這種行為的不同惰拱,每次從同一個(gè)信號生產(chǎn)者可能會(huì)得到不同順序或者版本的事件啊送,甚至整個(gè)流可能完全不同偿短。不像一個(gè)普通的信號,直到有一個(gè)觀察者被添加才會(huì)開始啟動(dòng)昔逗,每次都會(huì)為新添加的觀察者重新工作一次。
開啟一個(gè)信號生產(chǎn)者會(huì)返回一個(gè)<code> disposable </code>勾怒,用了中斷或者取消(interrupt/cancel)這個(gè)信號生產(chǎn)者的工作婆排。
和信號一樣,信號生產(chǎn)者可以被操作符比如map段只,filter等操作。每個(gè)信號的操作符都可以通過“l(fā)ifted”遷移后在信號生產(chǎn)者上使用翼悴。而且,還有幾個(gè)特有的操作符用了控制工作什么時(shí)候開始和怎么運(yùn)行幔妨,比如<code> times </code>。
緩沖:Buffers
一個(gè)緩沖通過 <code> SignalProducer.buffer() </code> 創(chuàng)建,是一個(gè)事件的隊(duì)列(通常指定數(shù)量)谍椅,當(dāng)新信號產(chǎn)生時(shí)误堡,會(huì)重新執(zhí)行隊(duì)列里的事件雏吭。
和<code> pipe </code>相似,這個(gè)方法返回一個(gè)觀察者杖们。每個(gè)發(fā)給這個(gè)觀察者的事件會(huì)被加入隊(duì)列。如果這個(gè)緩沖區(qū)已經(jīng)達(dá)到創(chuàng)建時(shí)預(yù)定的數(shù)量姥饰,當(dāng)新的事件發(fā)來時(shí)孝治,最早的一個(gè)會(huì)被移出隊(duì)列列粪。
觀察者:Observers
<code> Observer </code>是指任何等待從信號中接收事件的東西谈飒。
Observers可以通過<code> Signal.observe </code>或者<code> SignalProducer.start</code>隱式獲得。
動(dòng)作:Actions
動(dòng)作用 <code> Action </code>類型表示杭措,指當(dāng)有輸入時(shí)會(huì)做一些工作。當(dāng)動(dòng)作執(zhí)行時(shí)鸳址,會(huì)有0個(gè)或者多個(gè)值輸出;或者會(huì)產(chǎn)生一個(gè)失敗氯质。
Action用來處理用戶交互時(shí)做一些處理很方便,比如當(dāng)一個(gè)按鈕點(diǎn)擊時(shí)這種動(dòng)作闻察。Action也可以和一個(gè)屬性自動(dòng)關(guān)聯(lián)disabled。比如當(dāng)一個(gè)UI控件的關(guān)聯(lián)Action被設(shè)置成disabled時(shí)呢灶,這個(gè)控件也會(huì)disabled钉嘹。
為了和NSControl和UIControl交互鸯乃,RAC提供了<code> CocoaAction </code>類型可以橋接到OC下使用
屬性:Properties
一個(gè)屬性表現(xiàn)為<code> PropertyType </code>協(xié)議(protocol), 保存一個(gè)值跋涣,并且會(huì)將將來每次值的變化通知給觀察者們。
property的當(dāng)前值可以通過獲取<code> value </code>獲得奖年。<code> producer </code>返回一個(gè)會(huì)一直發(fā)送值變化信號生成者(signal producer ),
<code> <~ </code>運(yùn)算符是提供了幾種不同的綁定屬性的方式陋守。注意這里綁定的屬性必須是<code> MutablePropertyType </code>類型的利赋。
- <code> property <~ signal </code> 將一個(gè)屬性和信號綁定在一起,屬性的值會(huì)根據(jù)信號送過來的值刷新媚送。
- <code> property <~ producer </code> 會(huì)啟動(dòng)這個(gè)producer,并且屬性的值也會(huì)隨著這個(gè)產(chǎn)生的信號送過來的值刷新季希。
- <code> property <~ otherProperty </code>將一個(gè)屬性和另一個(gè)屬性綁定在一起,這樣這個(gè)屬性的值會(huì)隨著源屬性的值變化而變化博敬。
<code> DynamicProperty </code> 類型用于橋接OC的要求KVC或者KVO的API峰尝,比如<code> NSOperation </code>偏窝。要提醒的是大部分AppKit和UIKit的屬性都不支持KVO,所以要觀察它們值的變化需要通過其他的機(jī)制伦意。相比<code> DynamicProperty </code>要優(yōu)先使用 <code> MutablePropertyType </code>類型硼补。
銷毀:Disposables
disposable表現(xiàn)為<code> Disposable </code> 協(xié)議,用于內(nèi)存管理和釋放銷毀。
當(dāng)你啟動(dòng)一個(gè)signal producer已骇,一個(gè)disposable會(huì)被返回⊥蚀ⅲ可以用于被調(diào)起者取消已經(jīng)啟動(dòng)的signal producer(比如后臺線程的處理,網(wǎng)絡(luò)請求等)鲤竹,清除臨時(shí)資源,發(fā)送一個(gè)最終的<code> Interrupted </code>事件給它創(chuàng)建的信號碘橘。
觀察一個(gè)信號也會(huì)返回一個(gè)disposable揩尸。調(diào)用后就不會(huì)再收到這個(gè)信號發(fā)過來變化的值,但是這對信號本身不會(huì)產(chǎn)生影響岩榆。
更多關(guān)于銷毀的信息查看這份文檔:RAC Design Guidelines.
調(diào)度器:Schedulers
調(diào)度器坟瓢,類型是<code> SchedulerType </code> 協(xié)議, 是一個(gè)序列化的要被執(zhí)行的任務(wù)隊(duì)列或者是一組向外輸出的結(jié)果。
信號和信號生成者可以按照安排好的次序發(fā)送事件到一個(gè)指定的 scheduler折联。信號生產(chǎn)者還可以在指定的調(diào)度器上被啟動(dòng)。
scheduler很像GCD诚镰,但是scheduler可以被銷毀(通過Disposable),而且總是連續(xù)執(zhí)行月杉。由于 ImmediateScheduler
會(huì)引發(fā)異常, scheduler不提供同步的操作抠艾。這樣可以避免出現(xiàn)死鎖苛萎,還鼓勵(lì)使用信號的操作符而不是blocking work。
scheduler也有點(diǎn)像<code>NSOperationQueue</code>, 但是scheduler不允許任務(wù)根據(jù)另一個(gè)調(diào)度器而改變順序蛙酪。
歡迎關(guān)注我的微博:@沒故事的卓同學(xué)