ReactiveCocoa4基本操作

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

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

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

observe(观察)

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

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四种。当信号发送事件时,就会触发相应的回调。设置回调的方法如下:

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,即使没有订阅者也可以触发回调,像下面这样:

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操作可以将事件流进行转换,将原来的值进行改变等操作后产生一个新的事件流、例如:

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顾名思义,可以对信号进行过滤,只传递满足条件的值。比如:

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可以将某一事件的值聚集后合成为一个新值,在输入的流结束后发送。

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操作可以将一个事件流的值聚合为一个单个的数组值,在输入流结束后发送。

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 官方文档

本文总阅读量