观察者从未打电话

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

我可能遗漏了一些明显的东西,但我现在没看到....

我也尝试过 addObserverselector: "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")
}

问题出在 postNotificationNameaddObserverForName 中的第二个参数:object。当您添加一个观察者并传递一个非零 object 值时,这意味着观察者块将 运行 当通知来自该对象时,并且仅来自该对象。 但是,当您触发通知时,您会执行 object: nil。所以你的通知被忽略了。

另一方面,为 object 传递 nil 值意味着 "I want to receive this notification regardless of who sends it".

因此您需要确保两个地方的对象值相同:selfnil

标题问题的另一个答案(但不是这个例子),但希望对我过去 3 小时所处情况的其他人有所帮助:

确保将通知中心观察器添加到具有持久化实例的 class 中。我在 class 中创建了观察者,它被称为例如MyClass().setupNotification 在另一个 class.

的本地方法中

这意味着观察者被立即删除并且不会针对任何实例持续存在。

小学生错误 - 但希望这有助于其他搜索此内容的人。