ReactiveCocoa 4 文檔翻譯:框架組成介紹

原文:Framework Overview

我翻譯的RAC4的文檔
ReactiveCocoa 4 官方文檔翻譯
ReactiveCocoa 4 文檔翻譯:基本操作符(一)
ReactiveCocoa 4 文檔翻譯:基本操作符(二)
ReactiveCocoa 4 文檔翻譯:框架組成介紹
ReactiveCocoa 4 文檔翻譯:兼容Objective-C
ReactiveCocoa 4 文檔翻譯--設(shè)計指南(一):事件的規(guī)范
ReactiveCocoa 4 文檔翻譯:設(shè)計指南(二):信號的規(guī)范
[翻譯]ReactiveCocoa 4 最佳實踐

本文將以整個框架的高度介紹RAC框架中的主要組成元素,嘗試說明它們是怎么組成在一起工作和各自的職責(zé)。這會有助于你學(xué)習(xí)新模塊和查找相關(guān)詳細(xì)說明的文檔。
關(guān)于RAC的例子和應(yīng)該怎么使用可以查看這兩個文檔:ReactiveCocoa 4 官方文檔翻譯:ReadMe 或者 Design Guidelines。

事件:Events

一個事件, 用<code> Event </code>類型表示, 表示某些事情已經(jīng)發(fā)生。 在RAC中事件是傳播(center-piece of communication)的核心。 一個事件可能是button的一次點擊,從API返回的一些信息,一個錯誤的發(fā)生,或者一個長時間操作完成了。無論如何,一些東西產(chǎn)生事件,然后通過signal發(fā)送給每個訂閱這個signal的觀察者。

<code> Event </code>是一個枚舉類型,可能有四種值(Next中有值,其他三種表示結(jié)束):

  • <code> Next </code>代表有一個新的值從源產(chǎn)生。
  • <code> Failed </code>說明在信號源完成前發(fā)生了一個錯誤。事件會被當(dāng)做一個類型為<code> ErrorType </code>的參數(shù),一種在事件中聲明過的表示已知錯誤的類型。如果這個錯誤沒有被聲明許可過,可以用<code> NoError </code>表示。
  • <code> Completed </code>說明事件已經(jīng)成功結(jié)束。不會再有值發(fā)送出來。
  • <code> Interrupted </code>說明事件被取消了,意味著操作既沒有成功也沒有失敗。

信號:Signals

一個信號, 用 <code> Signal </code>類型表示,是一連串隨著時間發(fā)出的可以被觀察的事件。

信號通常用來表示事件流正在發(fā)出,比如通知,用戶的輸入等。每當(dāng)動作被執(zhí)行或者數(shù)據(jù)已經(jīng)接受,事件們就會通過signal發(fā)出,signal會把它們推送給每個觀察者。所有的觀察者都會同時接受到事件。

用戶如果想要接收它們的事件必須observe(觀察)這個signal。觀察一個信號不會觸發(fā)其他副作用。換句話說,事件是源驅(qū)動,基于推送,觀察者在整個生命周期里不會受到到任何影響。當(dāng)觀察一個信號時,用戶只能按照順序處理信號里的事件。不能隨意訪問信號里的事件。

信號可以被操作符操作。常用的操作一個信號的有filter,map和reduce,zip可以一次處理多個信號源。操作符只能在Next事件中才能使用。(具體操作符可以參考我翻的這篇:ReactiveCocoa 4 文檔翻譯:基本操作符

信號的整個生命周期有一組Next事件組成,最后是一個終結(jié)事件,可能是Failed, Completed, 或者Interrupted中的任一個。終結(jié)事件沒有被包含在事件的值里,他們需要被單獨處理。

管道:Pipes

一個管道,通過 <code>Signal.pipe()</code>創(chuàng)建。一個可以被手動控制的信號。
這個方法返回一個信號和一個observer??梢钥刂菩盘柊l(fā)送事件給觀察者。這個在將非RAC的代碼轉(zhuǎn)變到信號世界里特別有用。

比如,可以不用在block的回調(diào)里處理業(yè)務(wù)邏輯,將blocks簡化成發(fā)送事件給觀察者。同時信號可以被返回,隱藏回調(diào)里的具體實現(xiàn)。

信號生產(chǎn)者:Signal Producers

一個信號生產(chǎn)者,以 <code> SignalProducer </code>類型表示,創(chuàng)建信號并且產(chǎn)生副作用。

可以用來表示一組操作或者任務(wù),比如網(wǎng)絡(luò)請求,每次<code> start()</code>調(diào)用后會創(chuàng)建一個新的操作,允許發(fā)起者觀察結(jié)果。通過<code> startWithSignal()</code>可以訪問到產(chǎn)生的信號,允許被多次觀察。

因為<code> start()</code>這種行為的不同,每次從同一個信號生產(chǎn)者可能會得到不同順序或者版本的事件,甚至整個流可能完全不同。不像一個普通的信號,直到有一個觀察者被添加才會開始啟動,每次都會為新添加的觀察者重新工作一次。

開啟一個信號生產(chǎn)者會返回一個<code> disposable </code>,用了中斷或者取消(interrupt/cancel)這個信號生產(chǎn)者的工作。
和信號一樣,信號生產(chǎn)者可以被操作符比如map,filter等操作。每個信號的操作符都可以通過“l(fā)ifted”遷移后在信號生產(chǎn)者上使用。而且,還有幾個特有的操作符用了控制工作什么時候開始和怎么運行,比如<code> times </code>。

緩沖:Buffers

一個緩沖通過 <code> SignalProducer.buffer() </code> 創(chuàng)建,是一個事件的隊列(通常指定數(shù)量),當(dāng)新信號產(chǎn)生時,會重新執(zhí)行隊列里的事件。

和<code> pipe </code>相似,這個方法返回一個觀察者。每個發(fā)給這個觀察者的事件會被加入隊列。如果這個緩沖區(qū)已經(jīng)達(dá)到創(chuàng)建時預(yù)定的數(shù)量,當(dāng)新的事件發(fā)來時,最早的一個會被移出隊列。

觀察者:Observers

<code> Observer </code>是指任何等待從信號中接收事件的東西。

Observers可以通過<code> Signal.observe </code>或者<code> SignalProducer.start</code>隱式獲得。

動作:Actions

動作用 <code> Action </code>類型表示,指當(dāng)有輸入時會做一些工作。當(dāng)動作執(zhí)行時,會有0個或者多個值輸出;或者會產(chǎn)生一個失敗。

Action用來處理用戶交互時做一些處理很方便,比如當(dāng)一個按鈕點擊時這種動作。Action也可以和一個屬性自動關(guān)聯(lián)disabled。比如當(dāng)一個UI控件的關(guān)聯(lián)Action被設(shè)置成disabled時,這個控件也會disabled。

為了和NSControl和UIControl交互,RAC提供了<code> CocoaAction </code>類型可以橋接到OC下使用

屬性:Properties

一個屬性表現(xiàn)為<code> PropertyType </code>協(xié)議(protocol), 保存一個值,并且會將將來每次值的變化通知給觀察者們。

property的當(dāng)前值可以通過獲取<code> value </code>獲得。<code> producer </code>返回一個會一直發(fā)送值變化信號生成者(signal producer ),

<code> <~ </code>運算符是提供了幾種不同的綁定屬性的方式。注意這里綁定的屬性必須是<code> MutablePropertyType </code>類型的。

  • <code> property <~ signal </code> 將一個屬性和信號綁定在一起,屬性的值會根據(jù)信號送過來的值刷新。
  • <code> property <~ producer </code> 會啟動這個producer,并且屬性的值也會隨著這個產(chǎn)生的信號送過來的值刷新。
  • <code> property <~ otherProperty </code>將一個屬性和另一個屬性綁定在一起,這樣這個屬性的值會隨著源屬性的值變化而變化。

<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)你啟動一個signal producer,一個disposable會被返回??梢杂糜诒徽{(diào)起者取消已經(jīng)啟動的signal producer(比如后臺線程的處理,網(wǎng)絡(luò)請求等),清除臨時資源,發(fā)送一個最終的<code> Interrupted </code>事件給它創(chuàng)建的信號。

觀察一個信號也會返回一個disposable。調(diào)用后就不會再收到這個信號發(fā)過來變化的值,但是這對信號本身不會產(chǎn)生影響。

更多關(guān)于銷毀的信息查看這份文檔:RAC Design Guidelines.

調(diào)度器:Schedulers

調(diào)度器,類型是<code> SchedulerType </code> 協(xié)議, 是一個序列化的要被執(zhí)行的任務(wù)隊列或者是一組向外輸出的結(jié)果。

信號和信號生成者可以按照安排好的次序發(fā)送事件到一個指定的 scheduler。信號生產(chǎn)者還可以在指定的調(diào)度器上被啟動。

scheduler很像GCD,但是scheduler可以被銷毀(通過Disposable),而且總是連續(xù)執(zhí)行。由于 ImmediateScheduler
會引發(fā)異常, scheduler不提供同步的操作。這樣可以避免出現(xiàn)死鎖,還鼓勵使用信號的操作符而不是blocking work。
scheduler也有點像<code>NSOperationQueue</code>, 但是scheduler不允許任務(wù)根據(jù)另一個調(diào)度器而改變順序。

歡迎關(guān)注我的微博:@沒故事的卓同學(xué)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容