如果我多次註冊同一個事件,它會執行任何操作嗎?或者我需要多次取消註冊?如果是後者,我如何檢查我是否已經註冊接收特定事件?多次註冊觀察者會有什麼影響?
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. NSNotificationCenter:添加觀察者,但只有未註冊才能觀察?可以查詢對象的觀察狀態?
- 4. 觀察者和主題觀察者模式之間有什麼區別
- 5. 將setCellStyle多次應用於org.apache.poi.ss.usermodel.Cell會有什麼影響?
- 6. 儘管觀察者被移除,通知觀察者多次呼叫
- 7. 爲什麼可觀察快照觀察者矢量
- 8. 訪問Windows註冊表值有什麼性能影響?
- 9. 觀察者模式 - 觀察者創建
- 10. 觀察者模式 - 什麼時候到
- 11. AngularJS - 爲什麼觀察者被移除?
- 12. 觀察者模式Java - 使用線程的多個觀察者
- 13. Android - 從嵌套視圖取消註冊觀察者
- 14. android註冊到服務的內容觀察者
- 15. 退訂RxJS可觀察到的影響
- 16. RxJS影響從外部觀察
- 17. 可觀察類的性能影響
- 18. 檢查註冊內容觀察員
- 19. 「觀察家......未註冊」的錯誤
- 20. Android「觀察者」
- 21. 觀察者隱含有
- 22. Java觀察者和可觀察的
- 23. 當觀察者變爲零時觀察者會自動移除嗎?
- 24. 觀察者和回調之間有什麼大不同?
- 25. 單元測試REDX-SAGA的觀察者有什麼意義?
- 26. 初學者JavaFX觀察者
- 27. 當觀察者的觀察者的壽命長於可觀察到的
- 28. 觀察者模式
- 29. NSInternalInconsistencyException觀察者contentSize
- 30. '類PlayingTimer的實例0x7c37edd0被釋放,而鍵值觀察者仍然註冊它。目前的觀察
爲什麼不試試看看會發生什麼? – 2011-12-27 00:10:38