本文主要提一些在ReactiveCocoa4中主要的操作,主要包括
对事件流产生副作用(Performing side effects with event streams)
observe(观察)
Observer(观察者)可以对Signals(信号)进行Observe(观察)操作,观察这个信号将来每次发送的事件。
1 | signal.observe(Signal.Observer { event in |
从上面的代码中我们可以看到,事件一共有Next、Failed、Completed、Interrupted四种。当信号发送事件时,就会触发相应的回调。设置回调的方法如下:
1 | signal.observeNext { next in |
最后,你可以只关注你关心的事件而不必观察所有类型。
注入影响(Injecting effects)
on
通过on操作可以用来观察SignalProducer,即使没有订阅者也可以触发回调,像下面这样:
1 | let producer = signalProducer |
而与Observer观察Signal不同的是,producer需要在started之后才能触发。
操作符合成(Operator composition)
lift
通过lift操作可以将Signal的操作符向上迁移至SignalProducer,产生一个新的SignalProducer,在其产生的每个Signal中应用该操作符。
Map(映射)、Filter(过滤)、Reduce(聚集) –转换事件流(Transforming event streams)
Map映射
使用map操作可以将事件流进行转换,将原来的值进行改变等操作后产生一个新的事件流、例如:1
2
3
4
5
6
7let (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
Filter过滤
filter顾名思义,可以对信号进行过滤,只传递满足条件的值。比如:1
2
3
4
5
6
7
8let (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
在上面的代码中,条件为filter { number in number % 2 == 0 },表示符合条件的值为能被2整除的数,则1和3被过滤掉了,观察者不会观察到这两个Next事件。
Aggregate聚集
reduce可以将某一事件的值聚集后合成为一个新值,在输入的流结束后发送。1
2
3
4
5
6
7let (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
collect操作可以将一个事件流的值聚合为一个单个的数组值,在输入流结束后发送。
1 | let (signal, observer) = Signal<Int, NoError>.pipe() |
附上一个网址,以图案的方式展示了很多RAC信号的操作http://neilpa.me/rac-marbles/
更多资料:
ReactiveCocoa 4官方文档