2011-12-27 70 views
2

如果我多次註冊同一個事件,它會執行任何操作嗎?或者我需要多次取消註冊?如果是後者,我如何檢查我是否已經註冊接收特定事件?多次註冊觀察者會有什麼影響?

+0

爲什麼不試試看看會發生什麼? – 2011-12-27 00:10:38

回答

5

您將多次收到通知。文件聲稱有一些情況下你會想要這個,但我想不出任何。

您可以在添加觀察者之前立即使用removeObserver:removeObserver:name:object:,以確保不會多次添加。調用removeObserver:的對象實際上並未觀察到通知,這沒有任何問題。

或者(這可能是最高性能和最可靠的選項),您可以創建自己的NSSet對象來存儲您已添加到特定通知的對象,並檢查您是否要添加該對象一個副本。

1

調用removeObserver:時沒有任何問題,但實際上並沒有觀察到通知。

我試過這樣做,因爲我認爲如果它實現的很好,它不會抱怨在沒有對象被註冊爲觀察者的情況下移除一個對象。但我有個例外:

***由於未捕獲的異常'NSRangeException',原因:'無法爲關鍵路徑「aKeyPath」刪除觀察者,因爲它未註冊爲觀察者。

所以,實際上,如果你是觀察員,你必須自己管理自己。與iOS開發的奢侈品相比,這是相當荒謬的。

+2

接受的答案是關於通過NSNotificationCenter進行通知的觀察者,而不是KVO(關鍵值觀察者),它確實會拋出異常。有時你只需要捕捉這個異常並繼續前進。 – GreatWiz 2014-03-11 10:26:58

0
NSString *obString = [NSString stringWithFormat:@"%@", session.observationInfo]; 
NSRange rangeOfKey = [obString rangeOfString:observedKey]; 

if (rangeOfKey.location != NSNotFound) { 
    // 
    NSLog(@"observing"); 
    [session removeObserver:self forKeyPath:observedKey]; 
} 
else { 
    // 
    NSLog(@"not observing"); 
}