簡體   English   中英

從一個地方刪除所有通知觀察者

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

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