繁体   English   中英

观察者从未打电话

[英]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:"但这会引发无法识别的选择器异常。

问题出在postNotificationNameaddObserverForNameobject的第二个参数上。 当添加观察者并传递非object值时,这意味着当通知来自该对象且仅来自该对象时,观察者块将运行。 但是,当您触发通知时,您将object: nil 因此,您的通知将被忽略。

另一方面,传递objectnil值表示“无论谁发送,我都希望接收此通知”。

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

您有理由需要使用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个小时遇到的情况下帮助其他人:

确保将您的notificationcenter观察器添加到具有持久实例的类中。 我在另一个类的本地方法内的名为MyClass()。setupNotification的类内创建了观察器。

这意味着观察者被立即删除,并且没有针对任何实例进行持久化。

小学生错误-希望这可以帮助其他人进行搜索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM