2011-04-11 27 views
25

刪除所有通知觀察者我想刪除的通知觀察者和我使用的方法:從一個地方

removeObserver: name:@"myNotification" object:nil 

這一點。現在有很多觀察者正在收聽這個通知,我想從集中的地方一次性刪除所有這些通知。我可以在第一個參數中傳遞'nil',它會刪除所有正在監聽myNotification的觀察者嗎?

+1

你試過了嗎? – 2011-04-12 03:42:31

回答

76

您可以一起從通知中心刪除一個對象,這意味着不會觸發通知。例如,當我有一個已經註冊通知的視圖控制器時,我將這行包含在我的dealloc中。

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

這是在對象級別...所以它會取消註冊許多通知。它不會註銷許多對象中的一個通知。

希望我正確理解你的問題。

+0

好的。有沒有辦法從另一個對象註銷一個對象?我是A類,想從通知中註銷B類對象。 – Abhinav 2011-04-11 17:27:04

+0

我不認爲這是@Abhinav的意思。他想從NSNotificationCenter調度表中刪除所有觀察者,沒有特定的對象停止觀察者所有的通知。 – XJones 2011-04-11 17:27:08

+0

@xjones我重新閱讀,你是正確的。我讀'第一個參數'作爲通知名稱,而不是對象。這就是說,沒有辦法去除特定通知的所有觀察者(因爲看起來我很少有人說過)。只需在每個註冊的課程中完成。 – 2011-04-11 17:29:51

1

不幸的是,沒有辦法在一個地方刪除特定通知的所有觀察者。雖然肯定會有這樣的情況,但這樣做通常很危險,做觀察的對象應該負責添加和刪除自己作爲特定通知的觀察者。這確保了B/C觀察員不會出現不可預知的行爲,從而可以自行配置和清理。

如果生成通知的對象消失,則觀察者無關緊要,因爲觀察者無論如何都不知道該對象。這只是意味着對象不會再生成任何通知。

[編輯:針對你的意見RE CLASS B STOPPING CLASS A通過觀察]

我剛纔看到你的評論。有不同的方法來實現這一點,特別是如果B類知道A類的時候。當你引用類時,聽起來像你想影響一個類的所有實例與特定實例。如果你有一些條件,你可以在處理通知時檢查,這就是我將如何處理這個問題。在通知處理程序是這樣的:

if ([self shouldRespondToNotificationNamed:notification.name]) { 
    [self performNotificationAction]; 
} 

如果你沒有,你可以檢查一個條件,然後創建一個無論是在有關類別的伊娃,或者在可以全局訪問所有的地方類實例。我通常使用單例來存儲不會持久的全局應用程序狀態。如果它仍然存在,那麼可以使用你在其他國家使用的任何方法。

7

在斯威夫特的情況下,你在做這樣的:

NSNotificationCenter.defaultCenter().removeObserver(self) 

而且在斯威夫特3:

NotificationCenter.default.removeObserver(self) 
相關問題