ReactiveCocoa 4 文檔翻譯:基本操作符(一)

文檔地址:Basic Operators

注意本文所提的『操作符』宰缤,指的是操作signals和signal producers的函數,不是傳統(tǒng)編程語言里的操作符晃洒。換句話說慨灭,這些是用于處理事件流的基本元素。
本文將用事件流(event stream)指代Signal和SignalProducer球及。當有分歧時氧骤,會單獨指明類型。

本文將介紹:observe吃引、on筹陵、lift、map镊尺、filter朦佩、reduce 六個操作符。

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

對事件流產生副作用(Performing side effects with event streams)

觀察(Observation)

Signals可以通過<code> observe </code>函數進行觀察庐氮。參數是一個<code> Observer </code>语稠。可以觀察到這個signal將來每次發(fā)送的事件弄砍。
<pre><code>
signal.observe(Signal.Observer { event in

switch event {

case let .Next(next):

print("Next: (next)")

case let .Failed(error):

print("Failed: (error)")

case .Completed:

print("Completed")

case .Interrupted:

print("Interrupted")

}
})
</code></pre>
這樣當有<code> Next, Failed, Completed</code> 和<code> Interrupted </code>事件發(fā)生時就會觸發(fā)這些回調颅筋。
<pre><code>
signal.observeNext { next in

print("Next: (next)") }

signal.observeFailed { error in

print("Failed: (error)")}

signal.observeCompleted {

print("Completed") }

signal.observeInterrupted {

print("Interrupted")}
</code></pre>
你不必觀察所有類型,也可以只關注某個你關心的事件输枯。

注入影響(Injecting effects)

可以通過<code> on </code>來觀察<code> SignalProducer </code>,即使沒有人訂閱也會被觸發(fā)占贫。
<pre><code>
let producer = signalProducer

.on(started: {

print("Started")

}, event: { event in

print("Event: (event)")

}, failed: { error in

print("Failed: (error)")

}, completed: {

print("Completed")

}, interrupted: {

print("Interrupted")

}, terminated: {

print("Terminated")

}, disposed: {

print("Disposed")

}, next: { value in

print("Next: (value)")

})
</code></pre>
和<code> observe </code>相似桃熄,也可以只觀察你關注的某個事件。
需要提到的是<code> producer </code>要started后才會觸發(fā)。

可能很多人不了解什么是函數的副作用瞳收,可以參考下這篇:函數的副作用

操作符合成(Operator composition)

向上遷移

<code> Signal </code>的操作符可以通過<code> lift </code>函數向上遷移以在<code>SignalProducers</code>上使用碉京。
這樣會產生一個新的SignalProducer,然后將操作符應用到每個由它產生的Signal中螟深。

轉換事件流(Transforming event streams)

以下這些操作符會將事件流轉換成一個新的事件流谐宙。

映射(Mapping)

<code> map </code>用于將一個事件流的值操作后的結果產生一個新的事件流。
<pre><code>
let (signal, observer) = Signal<String, NoError>.pipe()

signal

.map { string in string.uppercaseString }

.observeNext { next in print(next) }

observer.sendNext("a") // Prints A

observer.sendNext("b") // Prints B

observer.sendNext("c") // Prints C
</code></pre>
強烈推薦這個可以到這個網站看看:Interactive visualisation of the map operator界弧。通過了圖案的方式來表達這個函數凡蜻。
下圖表示的是將一個數字映射為它的10倍。如果一個事件流本里的值是1垢箕、2划栓、3,經過這個map后產生一個新的事件流条获,里面的值為10忠荞、20、30帅掘。

過濾(Filtering)

<code> filter </code>函數可以按照之前預設的條件過濾掉不滿足的值委煤。
<pre><code>
let (signal, observer) = Signal<Int, NoError>.pipe()

signal

.filter { number in number % 2 == 0 }

.observeNext { next in print(next) }

observer.sendNext(1) // Not printed

observer.sendNext(2) // Prints 2

observer.sendNext(3) // Not printed

observer.sendNext(4) // prints 4

</code></pre>
下圖條件是x>10,最后剩下30,22修档,60


聚集(Aggregating)

<code> reduce </code>將事件里的值聚集后組合成一個值碧绞。要注意的是最后算出來的值直到輸入的流完成后才會被發(fā)送出去。
<pre><code>
let (signal, observer) = Signal<Int, NoError>.pipe()

signal .reduce(1) { $0 * $1 }

.observeNext { next in print(next) }

observer.sendNext(1) // nothing printed

observer.sendNext(2) // nothing printed

observer.sendNext(3) // nothing printed

observer.sendCompleted() // prints 6
</code></pre>
下圖展示的是輸入的值為1萍悴、2头遭、3、4癣诱、5计维。合并規(guī)則是求和。在5發(fā)送出去事件完成后撕予,新的事件流將運算后求得的15發(fā)送出去鲫惶。


歡迎關注我的微博:@沒故事的卓同學

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市实抡,隨后出現(xiàn)的幾起案子欠母,更是在濱河造成了極大的恐慌,老刑警劉巖吆寨,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赏淌,死亡現(xiàn)場離奇詭異,居然都是意外死亡啄清,警方通過查閱死者的電腦和手機六水,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掷贾,你說我怎么就攤上這事睛榄。” “怎么了想帅?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵场靴,是天一觀的道長。 經常有香客問我港准,道長旨剥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任叉趣,我火速辦了婚禮泞边,結果婚禮上,老公的妹妹穿的比我還像新娘疗杉。我一直安慰自己阵谚,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布烟具。 她就那樣靜靜地躺著梢什,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朝聋。 梳的紋絲不亂的頭發(fā)上嗡午,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音冀痕,去河邊找鬼荔睹。 笑死,一個胖子當著我的面吹牛言蛇,可吹牛的內容都是我干的僻他。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼腊尚,長吁一口氣:“原來是場噩夢啊……” “哼吨拗!你這毒婦竟也來了?” 一聲冷哼從身側響起婿斥,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤劝篷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后民宿,有當地人在樹林里發(fā)現(xiàn)了一具尸體娇妓,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年活鹰,在試婚紗的時候發(fā)現(xiàn)自己被綠了哈恰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坟桅。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蕊蝗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情赖舟,我是刑警寧澤蓬戚,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站宾抓,受9級特大地震影響子漩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜石洗,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一幢泼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讲衫,春花似錦缕棵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枷畏,卻和暖如春别厘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拥诡。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工触趴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渴肉。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓冗懦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宾娜。 傳聞我的和親對象是個殘疾皇子批狐,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容