观察者从未打电话
Observer never called
我有两个功能
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
NSNotificationCenter.defaultCenter().addObserverForName("personalDataDidLoad", object: self, queue: NSOperationQueue.mainQueue()) {_ in
print("Received notification")
self.showPersonalData()
}
loadPersonalData()
}
func loadPersonalData() {
//load data
print("personal data loaded")
NSNotificationCenter.defaultCenter().postNotificationName("personalDataDidLoad", object: nil)
但出于某种原因,这会输出
personal data loaded
而不是预期的
personal data loaded
Received notification
我可能遗漏了一些明显的东西,但我现在没看到....
我也尝试过 addObserver
和 selector: "showPersonalData:"
但这会引发无法识别的选择器异常..
是否有需要使用 addObserverForName(_:object:queue:usingBlock:)
的原因?
试试这个:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, "personalDataDidLoadNotification:", name: "personalDataDidLoad" object: nil)
loadPersonalData()
}
func loadPersonalData() {
//load data
print("personal data loaded")
NSNotificationCenter.defaultCenter().postNotificationName("personalDataDidLoad", object: nil)
}
func personalDataDidLoadNotification(notification: NSNotification) {
print("notification recieved")
}
问题出在 postNotificationName
和 addObserverForName
中的第二个参数:object
。当您添加一个观察者并传递一个非零 object
值时,这意味着观察者块将 运行 当通知来自该对象时,并且仅来自该对象。
但是,当您触发通知时,您会执行 object: nil
。所以你的通知被忽略了。
另一方面,为 object
传递 nil
值意味着 "I want to receive this notification regardless of who sends it".
因此您需要确保两个地方的对象值相同:self
或 nil
。
标题问题的另一个答案(但不是这个例子),但希望对我过去 3 小时所处情况的其他人有所帮助:
确保将通知中心观察器添加到具有持久化实例的 class 中。我在 class 中创建了观察者,它被称为例如MyClass().setupNotification 在另一个 class.
的本地方法中
这意味着观察者被立即删除并且不会针对任何实例持续存在。
小学生错误 - 但希望这有助于其他搜索此内容的人。
我有两个功能
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
NSNotificationCenter.defaultCenter().addObserverForName("personalDataDidLoad", object: self, queue: NSOperationQueue.mainQueue()) {_ in
print("Received notification")
self.showPersonalData()
}
loadPersonalData()
}
func loadPersonalData() {
//load data
print("personal data loaded")
NSNotificationCenter.defaultCenter().postNotificationName("personalDataDidLoad", object: nil)
但出于某种原因,这会输出
personal data loaded
而不是预期的
personal data loaded
Received notification
我可能遗漏了一些明显的东西,但我现在没看到....
我也尝试过 addObserver
和 selector: "showPersonalData:"
但这会引发无法识别的选择器异常..
是否有需要使用 addObserverForName(_:object:queue:usingBlock:)
的原因?
试试这个:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, "personalDataDidLoadNotification:", name: "personalDataDidLoad" object: nil)
loadPersonalData()
}
func loadPersonalData() {
//load data
print("personal data loaded")
NSNotificationCenter.defaultCenter().postNotificationName("personalDataDidLoad", object: nil)
}
func personalDataDidLoadNotification(notification: NSNotification) {
print("notification recieved")
}
问题出在 postNotificationName
和 addObserverForName
中的第二个参数:object
。当您添加一个观察者并传递一个非零 object
值时,这意味着观察者块将 运行 当通知来自该对象时,并且仅来自该对象。
但是,当您触发通知时,您会执行 object: nil
。所以你的通知被忽略了。
另一方面,为 object
传递 nil
值意味着 "I want to receive this notification regardless of who sends it".
因此您需要确保两个地方的对象值相同:self
或 nil
。
标题问题的另一个答案(但不是这个例子),但希望对我过去 3 小时所处情况的其他人有所帮助:
确保将通知中心观察器添加到具有持久化实例的 class 中。我在 class 中创建了观察者,它被称为例如MyClass().setupNotification 在另一个 class.
的本地方法中这意味着观察者被立即删除并且不会针对任何实例持续存在。
小学生错误 - 但希望这有助于其他搜索此内容的人。