[12] Unregister block-based NotificationCenter observer

Do you have to manually unregister block-based NotificationCenter observers?


final class NotificationToken {
    
    private let notificationCenter: NotificationCenter
    private let token: NSObjectProtocol
    
    init(notificationCenter: NotificationCenter = .default, token: NSObjectProtocol) {
        self.notificationCenter = notificationCenter
        self.token = token
    }
    
    deinit {
        notificationCenter.removeObserver(token)
    }
    
    func add(to bag: NotificationTokenBag) {
        bag.add(token: self)
    }
}

final class NotificationTokenBag {
    
    private var tokens: [NotificationToken] = []
    
    func add(token: NotificationToken) {
        tokens.append(token)
    }

}

protocol Disposable {
    func dispose()
}

extension NotificationToken: Disposable {
    func dispose() {
        notificationCenter.removeObserver(token)
    }
}

extension NotificationTokenBag: Disposable {
    func dispose() {
        tokens.removeAll()
    }
}

extension NotificationCenter {
    func observe(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Swift.Void) -> NotificationToken {
        let token = addObserver(forName: name, object: obj, queue: queue, using: block)
        return NotificationToken(notificationCenter: self, token: token)
    }
}

class MyClass {
    
    private var token: NotificationToken?
    
    init() {
        token = NotificationCenter.default.observe(forName: nil, object: nil, queue: nil) { (noti) in
            
        }
    }

}

class MyClass2 {
    
    private let bag = NotificationTokenBag()
    
    init() {
        NotificationCenter.default.observe(forName: nil, object: nil, queue: nil) { (noti) in
            
        }.add(to: bag)
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容