Hello ReactiveSwift(4): 框架概述 ——(簡譯)

官方文檔:
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绽左,mapreduce以及用于一次操縱多個(gè)信號(hào)的primitives(zip)。primitives只對(duì)value信號(hào)的事件進(jìn)行操作艇潭。

Signal的壽命由若干數(shù)量的value事件接著是一個(gè)終止事件構(gòu)成拼窥,該終止事件可以是中的任一項(xiàng)failedcompletedinterrupted(但不是組合)蹋凝。終止事件不包括在信號(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可以通過mapfilter等原函數(shù)操作命贴。使用lift方法恐疲,所有Signalprimitives可以被轉(zhuǎn)換成為以signal producer為對(duì)象的操作。除此以外套么,還有一些用來控制何時(shí)與如何啟動(dòng)signal producerprimitives培己,比如times

5胚泌、Observers

observer是什么省咨,是正在等待或可以等待從信號(hào)發(fā)出的事件的對(duì)象。
在RAC中玷室,observer表示為接受Event值的Observer零蓉。可以通過使用Signal.observeSignalProducer.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

actionAction類型表示房蝉,在執(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

propertyPropertyProtocol表示,其存儲(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岂却,combineLatestzip的處理類似于信號(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ù)重新排序或相互依賴级零。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末断医,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奏纪,更是在濱河造成了極大的恐慌鉴嗤,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件序调,死亡現(xiàn)場離奇詭異醉锅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)发绢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門硬耍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人边酒,你說我怎么就攤上這事经柴。” “怎么了墩朦?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵坯认,是天一觀的道長。 經(jīng)常有香客問我,道長牛哺,這世上最難降的妖魔是什么陋气? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮荆隘,結(jié)果婚禮上恩伺,老公的妹妹穿的比我還像新娘。我一直安慰自己椰拒,他們只是感情好晶渠,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燃观,像睡著了一般褒脯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缆毁,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天番川,我揣著相機(jī)與錄音,去河邊找鬼脊框。 笑死颁督,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浇雹。 我是一名探鬼主播沉御,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼昭灵!你這毒婦竟也來了吠裆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤烂完,失蹤者是張志新(化名)和其女友劉穎试疙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抠蚣,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祝旷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘶窄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缓屠。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖护侮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情储耐,我是刑警寧澤羊初,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響长赞,放射性物質(zhì)發(fā)生泄漏晦攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一得哆、第九天 我趴在偏房一處隱蔽的房頂上張望脯颜。 院中可真熱鬧,春花似錦贩据、人聲如沸栋操。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾芙。三九已至,卻和暖如春近上,著一層夾襖步出監(jiān)牢的瞬間剔宪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工壹无, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葱绒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓斗锭,卻偏偏與公主長得像地淀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拒迅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容