現在API似乎沒有提供一種方法來檢測是否已經爲特定的NSNotification添加了觀察者。避免添加多個NSNotification觀察者的最佳方法是,除了維護一個標誌以保持跟蹤外,還有什麼?有沒有人已經創建了一個類別來促進這一點?如何避免添加多個NSNotification觀察者?
回答
防止重複觀察者被添加的一種方式是在再次添加目標/選擇器之前顯式調用removeObserver。我想你可以添加此爲一類方法:
@interface NSNotificationCenter (UniqueNotif)
- (void)addUniqueObserver:(id)observer selector:(SEL)selector name:(NSString *)name object:(id)object {
[[NSNotificationCenter defaultCenter] removeObserver:observer name:name object:object];
[[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:name object:object];
}
@end
這假定你將只一個獨特的觀察者添加到每個目標的任何通知的名稱,因爲它會刪除任何現有的觀察員該通知的名字。
你在這裏以非常有趣,非標準的方式使用「觀察者」和「目標」。 'addObserver ...'中的「觀察者」指示發佈通知時將收到消息的對象,而不是指定構成該消息的方法。通知中沒有「目標」的概念。你稱之爲「目標」的東西在文檔中被稱爲「觀察者」。 – 2011-04-14 08:05:45
目標變量指示運行時應該在何處查找對象。我將arg名稱目標更改爲觀察者以消除任何潛在的混淆。 – futureelite7 2011-04-14 09:04:59
雖然我的「你無法回答」可能是太過文字(一個對象無法檢測到它是觀察者),但這個答案充其量只是很差的做法。對於OP來說,更好的建議是使用除用於此用例的發佈和觀察通知之外的其他實現。如果一個通知只打算讓一個觀察者使用,那麼使用一個委託和協議不僅可以強制執行,而且可以在對象和它的委託之間的關係中明確表示。 – XJones 2016-02-27 22:55:09
斯威夫特3,4:
import Foundation
extension NotificationCenter {
func setObserver(_ observer: AnyObject, selector: Selector, name: NSNotification.Name, object: AnyObject?) {
NotificationCenter.default.removeObserver(observer, name: name, object: object)
NotificationCenter.default.addObserver(observer, selector: selector, name: name, object: object)
}
}
斯威夫特2:
import Foundation
extension NSNotificationCenter {
func setObserver(observer: AnyObject, selector: Selector, name: String?, object: AnyObject?) {
NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object)
NSNotificationCenter.defaultCenter().addObserver(observer, selector: selector, name: name, object: object)
}
}
你給我添加觀察者的例子在swift 3.0中使用這個擴展 – 2018-01-08 06:52:24
的Upvoted答案與extension NotificationCenter { ... }
並沒有爲我工作,因爲我的應用程序中創建每次發佈通知時,都會有一個viewController的新實例(它有一個通知觀察者),所以刪除一個一個viewController的新實例的觀察者顯然不工作。 擁有Notification Observers的viewController的先前實例正在被調用。
下面的內容適用於我,因爲視圖一消失就立即刪除通知觀察者。
// Notification observer added
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self, selector: #selector(self.someFunc(notification:)), name: Notification.Name("myNotification"), object: nil)
}
// Notification observer removed
override func viewWillDisappear(_ animated: Bool) {
NotificationCenter.default.removeObserver(self, name: Notification.Name("myNotification"), object: nil)
}
更好的addObserver'viewDidAppear'而不是'viewWillAppear'。 – dimpiax 2017-10-12 11:54:01
- 1. 添加觀察者時是否需要接收NSNotification?
- 2. 作爲NSNotification觀察者的類?
- 3. 如何將觀察者添加到UIButton?
- 4. 如何將觀察者添加到NSManagedObject?
- 5. 如何在UISlider上添加觀察者
- 6. 避免觀察者代碼中的多重循環
- 7. 如何刪除UIView中的NSNotification的觀察者?
- 8. 如何使特定觀察者聽到的NSNotification?
- 9. 觀察者模式Java - 使用線程的多個觀察者
- 10. NSNotification觀察員開銷
- 11. 如何避免運行動態添加輸入的初始觀察事件
- 12. 將觀察者添加到BOOL變量
- 13. 將觀察者添加到NSString中
- 14. 同步數據,以避免造成同一觀察者再次
- 15. 觀察者模式:避免不良的重入行爲?
- 16. Firefox擴展dev:觀察首選項,避免多個通知
- 17. 觀察者模式 - 觀察者創建
- 18. 避免RxJS5可觀察量的遞歸
- 19. 如何在觀察者
- 20. 在Java中避免instanceof運算符的同時觀察多個觀測值?
- 21. NSNotification中的觀察者(itemDidFinishPlaying)隨機調用兩次
- 22. 如何在UIView中爲subviews.count添加觀察者?
- 23. 如何將基於時間的觀察者添加到Scala Future?
- 24. Android「觀察者」
- 25. 如何確定哪些NSNotification崩潰由於dealloc的-ED觀察者
- 26. 避免多次調用可觀察$ | Angular 2+中的異步
- 27. 如何避免重複常見的可觀察配置?
- 28. Java觀察者和可觀察的
- 29. Firebase可擴展性:整個數據集對多個觀察者的觀察
- 30. 初學者JavaFX觀察者
你可以舉一個這種情況發生的例子,或者爲什麼這會成爲一個問題? – 2011-04-14 06:00:01