观察者从未打过电话

时间:2016-02-15 23:04:32

标签: swift nsnotificationcenter nsnotifications nsnotification

我有两个功能

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 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。

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

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