文檔地址: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ā)送出去鲫惶。
歡迎關注我的微博:@沒故事的卓同學