簡體   English   中英

擴展NotificationCenter

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM