观察者从未打过电话

问题描述 投票:1回答:3

我有两个功能

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:",但这引发了一个无法识别的选择器异常..

swift nsnotificationcenter nsnotifications nsnotification
3个回答
3
投票

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

另一方面,为nil传递object值意味着“我想收到此通知,无论是谁发送”。

因此,您需要确保两个位置的对象值相同:selfnil


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")
}

0
投票

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

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

这意味着观察者立即被删除,并没有坚持任何实例。

小学生错误 - 但希望这有助于其他人搜索这个。

© www.soinside.com 2019 - 2024. All rights reserved.