事件是iOS生态系统的一个核心部分,在CocoaPods中进行搜索可以得到大量结果。更不用说,Apple默认提供了NSNotification
和NSNotificationCenter
。那么,EventRouter
与它们相比有什么不同/更好之处呢?
EventRouter
的文件大小仅为20KB左右,使其变得非常轻量。
每个函数、类和结构都进行了详细的文档记录(即将在Cocoadocs上提供)。
当前的代码覆盖率为99%。
EventRouter
没有其他依赖,使其成为一个无偏见的框架。想要使用EventRouter
和NSNotificationCenter
?没问题!注意:EventRouter现在有一个支持ReactiveCocoa的子规范,完全是可选的。以下是使用方法。
在使用EventRouter
时,有两种选择。
使用单例实例(对全局消息很有用)
EventRouter.router.addObserver(self, forEvent: "some-event")
或创建一个独立的实例(对包含一系列类的消息,如视图控制器及其所有组件很有用)
let router = EventRouter()
router.addObserver(self, forEvent: "some-event")
与NSNotificationCenter
不同,想要接收消息的类必须遵守EventRouterObserver
。EventRouterObserver
只有一个方法:routedEventOccurred:onRouter:withUserInfo
。
class MyViewController: UIViewController {
}
extension MyViewController: EventRouterObserver {
func routedEventOccurred(event: String, onRouter router: EventBroadcaster, withUserInfo userInfo: [NSObject: AnyObject]) {
if event == "my-awesome-event" {
// do something
}
}
}
添加观察者非常简单,只需
let router = EventRouter()
router.addObserver(self, forEvent: "my-awesome-event")
稍后来移除它
router.removeObserver(self, forEvent: 'my-awesome-event')
// or remove from all events
router.removeObserver(self)
因为路由器持有观察者的弱引用(EventRouterObserver
是一个类限制的协议),如果你的观察者被清理,它们将从观察者列表中移除,事件将不再发送。
如果您是ReactiveCocoa的粉丝,您可以为EventRouter/ReactiveCocoa
子规范安装。与EventRouter
不同,RACRouter
不使用观察者。相反,它通过router.signal
和router.producer
广播事件。
signal
和producer
在每次事件中都会发送一个元组,格式为《String, EventBroadcaster, [NSObject: AnyObject]?》。
let router = RACRouter()
router.signal.filter { $0.0 == "my-custom-event}.map { $0.2 }.ignoreNil()
EventRouter可通过CocoaPods获取。要安装,只需将以下行添加到您的Podfile中
pod "EventRouter"
Brendan Conron,[email protected]
EventRouter在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。