ReactiveCocoa4基本操作

本文主要提一些在ReactiveCocoa4中主要的操作,主要包括

  • observe
  • on
  • lift
  • map
  • filter
  • reduce

对事件流产生副作用(Performing side effects with event streams)

observe(观察)

Observer(观察者)可以对Signals(信号)进行Observe(观察)操作,观察这个信号将来每次发送的事件。

1
2
3
4
5
6
7
8
9
10
11
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")
}})

从上面的代码中我们可以看到,事件一共有NextFailedCompletedInterrupted四种。当信号发送事件时,就会触发相应的回调。设置回调的方法如下:

1
2
3
4
5
6
7
8
signal.observeNext { next in
print("Next: (next)") }
signal.observeFailed { error in
print("Failed: (error)")}
signal.observeCompleted {
print("Completed") }
signal.observeInterrupted {
print("Interrupted")}

最后,你可以只关注你关心的事件而不必观察所有类型。

注入影响(Injecting effects)

on

通过on操作可以用来观察SignalProducer,即使没有订阅者也可以触发回调,像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)")
})

而与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
7
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

Filter过滤

filter顾名思义,可以对信号进行过滤,只传递满足条件的值。比如:

1
2
3
4
5
6
7
8
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

在上面的代码中,条件为filter { number in number % 2 == 0 },表示符合条件的值为能被2整除的数,则13被过滤掉了,观察者不会观察到这两个Next事件。

Aggregate聚集

reduce可以将某一事件的值聚集后合成为一个新值,在输入的流结束后发送。

1
2
3
4
5
6
7
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

collect操作可以将一个事件流的值聚合为一个单个的数组值,在输入流结束后发送。

1
2
3
4
5
6
7
8
9
10
let (signal, observer) = Signal<Int, NoError>.pipe()
signal
.collect()
.observeNext { next in print(next) }
observer.sendNext(1) // nothing printed
observer.sendNext(2) // nothing printed
observer.sendNext(3) // nothing printed
observer.sendCompleted() // prints [1, 2, 3]

附上一个网址,以图案的方式展示了很多RAC信号的操作http://neilpa.me/rac-marbles/
更多资料:
ReactiveCocoa 4官方文档