官方文檔:
http://reactivecocoa.io/reactiveswift/docs/latest/index.html
實(shí)戰(zhàn)項(xiàng)目:
https://github.com/JornWu/ZhiBo_Swift.git
1壳贪、Events
一個(gè)事件,由代表Event類型谍咆,是一個(gè)事實(shí)沉馆,即抽象化表示事情發(fā)生抚官。在ReactiveSwift中剑刑,事件是溝通的核心沉眶。事件可能表示按下按鈕哮洽,從API接收到的信息填渠,發(fā)生錯(cuò)誤,或者完成長時(shí)間運(yùn)行的操作鸟辅。
無論如何氛什,某些事物會(huì)產(chǎn)生事件,并通過信號(hào)將其發(fā)送給任何數(shù)量的觀察者匪凉。
Event
是一個(gè)枚舉類型枪眉,表示一個(gè)值或三個(gè)終止事件之一:
-
value
事件
表示源提供了一個(gè)新的值。 -
failed
事件
表示之前的事件發(fā)出了錯(cuò)誤再层。事件由參數(shù)為ErrorType
類型贸铜,它決定了允許在事件中出現(xiàn)的故障類型。
如果不允許發(fā)生故障聂受,則事件可以使用NoError
類型來防止提供任何錯(cuò)誤蒿秦。 -
completed
事件
表示信號(hào)已成功完成,并且沒有更多的值由源發(fā)送了蛋济。 -
interrupted
事件
表示信號(hào)已經(jīng)終止棍鳖,因?yàn)樗侨∠@意味著操作既不是成功也不是不成功
2碗旅、Signals
信號(hào)渡处,由Signal所表示的類型,隨著時(shí)間的推移可以觀察到任何系列的事件祟辟。
Signal
通常用于表示已在“進(jìn)行中”的Event Stream
医瘫,如通知,用戶輸入等川尖。在執(zhí)行工作或接收到數(shù)據(jù)時(shí)登下,會(huì)發(fā)送事件信號(hào),將其推送給任何觀察者且所有觀察員同時(shí)看到事件叮喳。
用戶必須observer信號(hào)才能訪問其事件被芳。觀察信號(hào)不會(huì)觸發(fā)任何Side Effect
。換句話說馍悟,信號(hào)完全是由生產(chǎn)者為主導(dǎo)畔濒,推送式的,消費(fèi)者(觀察者)對(duì)其“一生”不會(huì)有任何影響锣咒。在觀察信號(hào)時(shí)侵状,用戶只能按照與信號(hào)發(fā)送相同的順序來評(píng)估事件赞弥。不能隨機(jī)訪問信號(hào)的值。
可以通過對(duì)它們應(yīng)用primitives來操縱信號(hào)趣兄。用于操縱單個(gè)信號(hào)的典型primitives
如可用 filter
绽左,map
和reduce
以及用于一次操縱多個(gè)信號(hào)的primitives
(zip
)。primitives
只對(duì)value
信號(hào)的事件進(jìn)行操作艇潭。
Signal
的壽命由若干數(shù)量的value
事件接著是一個(gè)終止事件構(gòu)成拼窥,該終止事件可以是中的任一項(xiàng)failed
,completed
或 interrupted
(但不是組合)蹋凝。終止事件不包括在信號(hào)的值中它們必須特別處理鲁纠。
3、Pipes
Pipe
鳍寂,通過創(chuàng)建Signal.pipe()
改含,是一個(gè)可以被手動(dòng)控制的信號(hào)。該方法返回信號(hào)和觀察者迄汛『慈溃可以通過向觀察者發(fā)送事件來控制信號(hào)。這對(duì)于將非RAC代碼橋接到信號(hào)界非常有用隔心。例如白群,塊可以簡單地向觀察者發(fā)送事件來代替在塊回調(diào)中的應(yīng)用程序邏輯的處理。同時(shí)硬霍,可以返回信號(hào)和隱藏回調(diào)的實(shí)現(xiàn)細(xì)節(jié)。
4笼裳、Signal Producers
signal producer
唯卖,是SignalProducer
類型的實(shí)例,它可以創(chuàng)建信號(hào)(signals
)并施加附作用(side effects
)躬柬。
signal producer
用來表示操作或者任務(wù)拜轨,比如網(wǎng)絡(luò)請(qǐng)求,每一次對(duì)它調(diào)用start()
將會(huì)生成一個(gè)新的潛在操作允青,并允許調(diào)用者觀察它的結(jié)果橄碾。還有一個(gè)startWithSignal()
方法,會(huì)給出產(chǎn)生的信號(hào)颠锉,允許在必要的情況下被監(jiān)聽多次法牲。
根據(jù)start()
方法的動(dòng)作方式,被同一個(gè)信號(hào)發(fā)生器生成的信號(hào)可能會(huì)有不同的事件順序或版本琼掠,甚至事件流完全不一樣拒垃!和普通的信號(hào)不同,在觀察者訂閱上之前瓷蛙,信號(hào)發(fā)生器不會(huì)開始工作(也就沒有事件會(huì)生成)悼瓮,并且在每一個(gè)新的觀察者訂閱上時(shí)其工作都會(huì)重新開始一個(gè)單獨(dú)的工作流戈毒。
啟動(dòng)一個(gè)signal producer
會(huì)返回一個(gè)銷毀器(disposable
),它可用來打斷或取消信號(hào)的工作横堡。
和Signal
一樣埋市,signal producer
可以通過map
、filter
等原函數(shù)操作命贴。使用lift
方法恐疲,所有Signal
的primitives
可以被轉(zhuǎn)換成為以signal producer
為對(duì)象的操作。除此以外套么,還有一些用來控制何時(shí)與如何啟動(dòng)signal producer
的primitives
培己,比如times
。
5胚泌、Observers
observer
是什么省咨,是正在等待或可以等待從信號(hào)發(fā)出的事件的對(duì)象。
在RAC中玷室,observer
表示為接受Event值的Observer零蓉。可以通過使用Signal.observe
或SignalProducer.start
的方法基于回調(diào)的形式隱式創(chuàng)建觀察者 穷缤。
6敌蜂、Lifetimes
當(dāng)觀察信號(hào)或啟動(dòng)信號(hào)發(fā)生器時(shí),重要的是考慮觀察應(yīng)該持續(xù)多久津肛。例如章喉,當(dāng)觀察信號(hào)以更新UI組件時(shí),一旦組件不再在屏幕上身坐,停止觀察它是有意義的秸脱。這個(gè)想法在ReactiveSwift中由Lifetime
類型表示。
import Foundation
final class SettingsController {
// Define a lifetime for instances of this class. When an instance is
// deinitialized, the lifetime ends.
private let (lifetime, token) = Lifetime.make()
func observeDefaultsChanged(_ defaults: UserDefaults = .standard) {
// `take(during: lifetime)` ensures the observation ends when this object
// is deinitialized
NotificationCenter.default.reactive
.notifications(forName: UserDefaults.didChangeNotification, object: defaults)
.take(during: lifetime)
.observeValues { [weak self] _ in self?.defaultsChanged(defaults) }
}
private func defaultsChanged(_ defaults: UserDefaults) {
// perform some updates
}
}
這token
是一個(gè)Lifetime.Token
部蛇,我們需要保持強(qiáng)引用摊唇,以便Lifetime
工作。(注意:至關(guān)重要的是只有一個(gè)強(qiáng)引用token
涯鲁,因此它在同一時(shí)間被初始化為self
巷查。)
Lifetime
任何時(shí)候觀察可能比觀察者更為有用:
1、 在NotificationCenter
上面的例子中抹腿,沒有Lifetime
觀察將永遠(yuǎn)不會(huì)完成(泄露內(nèi)存并浪費(fèi)CPU周期)岛请。
2、考慮一個(gè)觸發(fā)網(wǎng)絡(luò)請(qǐng)求的信號(hào)發(fā)生器 -Lifetime
如果觀察器被初始化幢踏,則結(jié)合一個(gè)可能允許自動(dòng)取消該請(qǐng)求髓需。
7、Actions
action
由Action類型表示房蝉,在執(zhí)行輸入時(shí)處理某些工作僚匆。在執(zhí)行中微渠,可能會(huì)產(chǎn)生零個(gè)或多個(gè)輸出值和/或失敗。
Actions
對(duì)于在用戶交互中執(zhí)行side-effecting
很有用咧擂,例如單擊按鈕時(shí)逞盆。也可以根據(jù)properties自動(dòng)禁用Actions
,且該禁用狀態(tài)可以表示到UI中等同于禁用與Actions
相關(guān)聯(lián)的任何控件松申。
8云芦、Properties
property由PropertyProtocol表示,其存儲(chǔ)某個(gè)值贸桶,并通知觀察者關(guān)于該值的未來將會(huì)變化舅逸。
屬性的當(dāng)前值可以從value
getter
中獲得。該producer
getter
返回一個(gè)信號(hào)產(chǎn)生器皇筛,將發(fā)送屬性的當(dāng)前值琉历,然后隨著時(shí)間的推移而變化的所有更改值。該signal getter
返回一個(gè)信號(hào)水醋,將發(fā)送隨著時(shí)間的所有變化的值旗笔,而不是初始值。
<~
操作可用于用不同的方式綁定屬性拄踪。
請(qǐng)注意蝇恶,在所有情況下,由BindingTargetProtocol表示的目標(biāo)必須是綁定狀態(tài)目標(biāo)惶桐。
由MutablePropertyProtocol表示的所有可變屬性類型都是固有的綁定目標(biāo)撮弧。
-
property <~ signal
將信號(hào)綁定到屬性,將屬性值更新為信號(hào)發(fā)送的最新值耀盗。 -
property <~ producer
啟動(dòng)給定的信號(hào)生成器想虎,并將屬性的值綁定到啟動(dòng)信號(hào)上發(fā)送的最新值。 -
property <~ otherProperty
將一個(gè)屬性綁定到另一個(gè)屬性叛拷,以便在更新源屬性時(shí)更新目標(biāo)屬性的值。
屬性提供了許多的變換如map
岂却,combineLatest
或zip
的處理類似于信號(hào)和信號(hào)產(chǎn)生器
9忿薇、Disposables
disposable
,由Disposable協(xié)議表示躏哩,是用于存儲(chǔ)器管理和消除的機(jī)制署浩。當(dāng)啟動(dòng)信號(hào)發(fā)生器時(shí),將返回disposable
扫尺。調(diào)用者可以使用該disposable
功能來取消已經(jīng)開始的工作(例如后臺(tái)處理筋栋,網(wǎng)絡(luò)請(qǐng)求等),清理所有臨時(shí)資源正驻,然后interrupted
根據(jù)創(chuàng)建的特定
信號(hào)發(fā)送最終事件 弊攘。觀察信號(hào)也可能返回disposable
抢腐。處理它會(huì)阻止觀察者從該信號(hào)中收到任何未來的事件,但對(duì)信號(hào)本身不會(huì)有任何影響襟交。有關(guān)取消的更多信息迈倍,請(qǐng)參閱RAC 設(shè)計(jì)指南。
10捣域、Schedulers
scheduler
啼染,由SchedulerProtocol協(xié)議所表示,是執(zhí)行工作或在遞送Value
的串行執(zhí)行隊(duì)列焕梅。信號(hào)和信號(hào)發(fā)生器可以被放到特定調(diào)度器上傳送事件迹鹅。信號(hào)生成器 還可以被放到特定調(diào)度器上開始工作。
Schedulers
類似于Grand Central Dispatch
隊(duì)列贞言,但Schedulers
支持取消(通過disposables)斜棚,并且始終連續(xù)執(zhí)行。除了ImmediateScheduler蜗字,Schedulers
不提供同步執(zhí)行打肝。這有助于避免死鎖,并鼓勵(lì)使用signal and signal producer primitives 挪捕,而不是阻止工作粗梭。
Schedulers
也有些類似NSOperationQueue
,但Schedulers
不允許任務(wù)重新排序或相互依賴级零。