我正在尝试为NotificationCenter编写一个扩展
我发现它的语法有点"boilerplatey“,我想提供一个简单的扩展来简化发布和观察。
我可以像这样调度一个事件
NotificationCenter.dispatch(key: <#T##String#>, payload: <#T##[String : String]#>)然而,我想以类似的方式观察一个事件。
我正在尝试创建像这样的东西
NotificationCenter.observe(key: <#T##String#>, handler: <#T##() -> Void#>)然而,这是不正确的。我不确定我如何处理应该在观察时触发的选择器函数的传递?
到目前为止,这是我的尝试。
extension NotificationCenter {
static func dispatch(key: String, payload: [String: String] = [:]) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: key), object: nil, userInfo: payload)
}
static func observe(key: String, handler: ()->Void) {
NotificationCenter.default.addObserver(
self, selector: handler, name: NSNotification.Name(rawValue: key), object: nil
)
}
}发布于 2018-12-20 20:10:09
听起来你需要这样的东西
extension NotificationCenter {
static func dispatch(key: String, payload: [String: String] = [:]) {
self.default.post(name: NSNotification.Name(rawValue: key), object: nil, userInfo: payload)
}
static func observe(key: String, handler: @escaping (Notification) -> Void) {
self.default.addObserver(forName: NSNotification.Name(rawValue: key), object: nil, queue: .main, using: handler)
}
}发布于 2018-12-20 20:02:11
您可以使用类似以下内容:
extension NotificationCenter {
class func observe(name: NSNotification.Name, handler: @escaping (Notification) -> Void) {
self.default.addObserver(forName: name, object: nil, queue: .main, using: handler)
}
}然后你可以像这样使用它:
NotificationCenter.observe(name: UIResponder.keyboardDidShowNotification) { notification in
// do something
}不过,你绝对应该在https://developer.apple.com/documentation/foundation/notificationcenter/1411723-addobserver上查看有关取消注册观察的信息。
https://stackoverflow.com/questions/53868171
复制相似问题