[英]Extending NotificationCenter
我正在嘗試為NotificationCenter
編寫擴展
我發現該語法有點“笨拙”,並且想提供一個簡單的擴展名,以簡化發布和觀察。
我可以這樣派遣一個活動
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
)
}
}
您可以使用如下形式:
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 。
聽起來您需要類似的東西
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)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.