ReactiveCocoa 4 图解之一——事件(Event)
2015-11-24 本文已影响1516人
HetfieldJoe
一个事件,由
Event类型表现,是用泛化的形式表示有事情发生了。在ReactiveCocoa中,事件是通信的核心。一个事件可以表示一个按钮被按下,从一个API接收到一些信息,错误的发生,或者一个长时间操作的完成。不管哪种情况,都是某些东西产生了事件,并且通过信号(Signal)来发送给任意多个监听器(Observer)。
事件是一个枚举类型,不是表示一个值(
value)就是表示下面三种终结事件中的一个:
-
Next事件提供一个发生源的值。 -
Failed事件表示信号正常终结之前发生了错误。事件有一个ErrorType参数,它决定了允许出现在失败事件中的错误类型。如果失败是不被允许的,可以使用NoError类型来防止事件提供任何错误信息。 -
Complete事件表示信号成功终结,事件源不会再发送任何值。 -
Interrupted事件表示信号因为取消操作而终结,意味着操作既不是成功也不是失败。
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. 事件的映射
事件有这样两个方法:
map<U>(f: Value ->U) -> Event<U, Event>mapError<F>(f: Value -> U) -> Event<Value, F>
这个两个方法分别将Next和Failed事件关联的值和错误变换成其他的值和错误,甚至是其他类型的值和错误。如何变换由方法参数传入的回调函数决定(也就是你来决定)。这两个方法,尤其是map方法,是信号变形发生的核心(后述)。
Event的映射
3. 关于事件的其他
关于事件还有这些有用的属性和功能:
-
isTerminating只读属性,如果事件是Next事件,这个属性返回false,如果是其余三种类型的事件会返回true。 -
value只读属性,如果事件是Next事件,这个属性返回事件关联的值,如果是其余三种类型的事件会返回�nil。 -
error只读属性,如果事件是Failed事件,这个属性返回事件关联的错误对象,如果是其余三种类型的事件会返回�nil。 - ReactiveCocoa重载了
==操作符,两个事件对象如果类型相同,并且关联的值(Next事件的情况)相等或错误(Failed事件的情况)相同,那么这两个事件就是相等的。