如果我多次註冊同一個事件,它會執行任何操作嗎?或者我需要多次取消註冊?如果是後者,我如何檢查我是否已經註冊接收特定事件?多次註冊觀察者會有什麼影響?
2
A
回答
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");
}
相關問題
- 1. 觀察對象未註冊爲觀察者
- 2. 觀察用戶註冊
- 3. 觀察與註冊回調
- 4. NSNotificationCenter:添加觀察者,但只有未註冊才能觀察?可以查詢對象的觀察狀態?
- 5. 觀察者和主題觀察者模式之間有什麼區別
- 6. 的Arquillian:試圖註冊相同的觀察,ServerSetupObserver多次
- 7. 將setCellStyle多次應用於org.apache.poi.ss.usermodel.Cell會有什麼影響?
- 8. 儘管觀察者被移除,通知觀察者多次呼叫
- 9. 爲什麼可觀察快照觀察者矢量
- 10. 訪問Windows註冊表值有什麼性能影響?
- 11. 觀察者模式 - 觀察者創建
- 12. 默認的zookeeper觀察者做什麼?
- 13. 觀察者模式 - 什麼時候到
- 14. AngularJS - 爲什麼觀察者被移除?
- 15. 觀察者模式Java - 使用線程的多個觀察者
- 16. 有效地註冊多個觀察通知
- 17. 與具有多個可觀察多次
- 18. 觀察者模式:事件處理器是否會影響主題執行?
- 19. @ServiceDependency註釋有什麼影響
- 20. 啓動appwidgets時註冊內容觀察者
- 21. android註冊到服務的內容觀察者
- 22. Android - 從嵌套視圖取消註冊觀察者
- 23. 光標加載器觀察者已註冊錯誤
- 24. 用戶註冊成功觀察者不工作
- 25. RxJS影響從外部觀察
- 26. 可觀察類的性能影響
- 27. 退訂RxJS可觀察到的影響
- 28. 具有兩個觀察者列表的觀察者模式
- 29. 我的觀察員爲何未註冊?
- 30. 「觀察家......未註冊」的錯誤
爲什麼不試試看看會發生什麼? – 2011-12-27 00:10:38