我有两个功能
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:"
,但这引发了一个无法识别的选择器异常..
问题在于postNotificationName
和addObserverForName
中的第二个参数:object
。当您添加观察者并传递非零object
值时,这意味着观察者块将在来自该对象的通知以及仅来自该对象时运行。但是,当您触发通知时,您执行object: nil
。因此,您的通知将被忽略。
另一方面,为nil
传递object
值意味着“我想收到此通知,无论是谁发送”。
因此,您需要确保两个位置的对象值相同:self
或nil
。
你需要使用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")
}
标题问题的另一个答案(但不是这个例子),但希望能帮助其他人处理过去3个小时的情况:
确保将notifycenter观察器添加到具有持久实例的类中。我在一个被称为例如一个类的类中创建了观察者。 MyClass()。setupNotification在另一个类的本地方法中。
这意味着观察者立即被删除,并没有坚持任何实例。
小学生错误 - 但希望这有助于其他人搜索这个。