一个事件,由
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
事件关联的错误对象的类型,都在事件的类型�声明中用泛型规定好了。所以初始化一个事件时,必须提供泛型标签。
2. 事件的映射
事件有这样两个方法:
map<U>(f: Value ->U) -> Event<U, Event>
mapError<F>(f: Value -> U) -> Event<Value, F>
这个两个方法分别将Next
和Failed
事件关联的值和错误变换成其他的值和错误,甚至是其他类型的值和错误。如何变换由方法参数传入的回调函数决定(也就是你来决定)。这两个方法,尤其是map
方法,是信号变形发生的核心(后述)。
3. 关于事件的其他
关于事件还有这些有用的属性和功能:
-
isTerminating
只读属性,如果事件是Next
事件,这个属性返回false
,如果是其余三种类型的事件会返回true
。 -
value
只读属性,如果事件是Next
事件,这个属性返回事件关联的值,如果是其余三种类型的事件会返回�nil
。 -
error
只读属性,如果事件是Failed
事件,这个属性返回事件关联的错误对象,如果是其余三种类型的事件会返回�nil
。 - ReactiveCocoa重载了
==
操作符,两个事件对象如果类型相同,并且关联的值(Next
事件的情况)相等或错误(Failed
事件的情况)相同,那么这两个事件就是相等的。