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