ES 6写法前端Swift&Objective-C

ReactiveCocoa 4 图解之一——事件(Event)

2015-11-24  本文已影响1516人  HetfieldJoe

一个事件,由Event类型表现,是用泛化的形式表示有事情发生了。在ReactiveCocoa中,事件是通信的核心。一个事件可以表示一个按钮被按下,从一个API接收到一些信息,错误的发生,或者一个长时间操作的完成。不管哪种情况,都是某些东西产生了事件,并且通过信号(Signal)来发送给任意多个监听器(Observer)。

事件是一个枚举类型,不是表示一个值(value)就是表示下面三种终结事件中的一个:

  1. Next事件提供一个发生源的值。
  2. Failed 事件表示信号正常终结之前发生了错误。事件有一个ErrorType参数,它决定了允许出现在失败事件中的错误类型。如果失败是不被允许的,可以使用NoError类型来防止事件提供任何错误信息。
  3. Complete事件表示信号成功终结,事件源不会再发送任何值。
  4. Interrupted事件表示信号因为取消操作而终结,意味着操作既不是成功也不是失败。

—— ReactiveCocoa 框架概览

1. 事件的内部构造



事件的定义中,有关于事件各种类型是这样表达的:

public enum Event<Value, Error: ErrorType> {
    /// A value provided by the signal.
    case Next(Value)

    /// The signal terminated because of an error. No further events will be
    /// received.
    case Failed(Error)

    /// The signal successfully terminated. No further events will be received.
    case Completed

    /// Event production on the signal has been interrupted. No further events
    /// will be received.
    case Interrupted

    ......
}

Next事件关联的值的类型,Failed事件关联的错误对象的类型,都在事件的类型�声明中用泛型规定好了。所以初始化一个事件时,必须提供泛型标签。

Event的类型

2. 事件的映射



事件有这样两个方法:

  1. map<U>(f: Value ->U) -> Event<U, Event>
  2. mapError<F>(f: Value -> U) -> Event<Value, F>

这个两个方法分别将NextFailed事件关联的值和错误变换成其他的值和错误,甚至是其他类型的值和错误。如何变换由方法参数传入的回调函数决定(也就是你来决定)。这两个方法,尤其是map方法,是信号变形发生的核心(后述)。

Event的映射

3. 关于事件的其他



关于事件还有这些有用的属性和功能:

  1. isTerminating只读属性,如果事件是Next事件,这个属性返回false,如果是其余三种类型的事件会返回true
  2. value只读属性,如果事件是Next事件,这个属性返回事件关联的值,如果是其余三种类型的事件会返回�nil
  3. error只读属性,如果事件是Failed事件,这个属性返回事件关联的错误对象,如果是其余三种类型的事件会返回�nil
  4. ReactiveCocoa重载了==操作符,两个事件对象如果类型相同,并且关联的值(Next事件的情况)相等或错误(Failed事件的情况)相同,那么这两个事件就是相等的。
上一篇 下一篇

猜你喜欢

热点阅读