[英]Removing all notification observer from a single place
我想刪除通知觀察者,我正在使用該方法:
[[NSNotificationCenter defaultCenter] removeObserver: name:@"myNotification" object:nil];
為了這。 現在有很多觀察者正在聽這個通知,我想從集中的地方一次性刪除所有這些通知。 我可以在第一個參數中傳遞'nil',它會刪除所有正在偵聽myNotification的觀察者嗎?
您可以一起從通知中心刪除對象,這意味着不會觸發任何通知。 例如,當我有一個已注冊通知的視圖控制器時,我將此行包含在我的dealloc中。
[[NSNotificationCenter defaultCenter] removeObserver:self];
這是在對象級別...因此它將取消注冊許多通知。 它不會取消注冊許多對象中的一個通知。
希望我能正確理解你的問題。
在Swift的情況下,你這樣做:
NSNotificationCenter.defaultCenter().removeObserver(self)
在Swift 3中:
NotificationCenter.default.removeObserver(self)
不幸的是,沒有辦法在一個地方刪除特定通知的所有觀察者。 雖然有一些情況會很好,但通常情況下這樣做是危險的,執行觀察的對象應該負責添加和刪除自己作為特定通知的觀察者。 這確保了b / c觀察者不會出現不可預測的行為,因此他們可以自行配置和清理。
如果生成通知的對象消失,則觀察者無關緊要,因為觀察者無論如何都不知道該對象。 它只是意味着對象不會再生成通知。
[編輯:對您的評論作出回應而B類從觀察中停止A類]
我剛看到你的評論。 有不同的方法可以實現這一點,特別是如果B類知道A類。當您引用類時,聽起來您想要影響類的所有實例與特定實例。 如果您有某些條件,您可以在處理通知時進行檢查,這就是我如何處理此問題。 在通知處理程序中,例如:
if ([self shouldRespondToNotificationNamed:notification.name]) {
[self performNotificationAction];
}
如果您沒有條件,則可以檢查,然后在相關類中創建一個作為iVar,或者在可以全局訪問所有類實例的位置。 我通常使用單例來存儲不會持久的全局應用程序狀態。 如果它仍然存在,那么使用你用於其他狀態的任何方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.