如果在初始化期间发布,则未收到通知?

时间:2017-11-29 18:26:36

标签: ios swift notifications ios11 swift4

我创建了一个example project来演示Notification处理的同步特性。

通知按预期处理 - 除非在模型初始化期间发布。

The Swift Programming Language (Swift 4), Two-Phase Initialization部分介绍了初始化的安全检查。在这里,它说:

  

安全检查4
  初始化程序无法调用任何实例方法   任何实例属性的值,或将self称为值   直到初始化的第一阶段完成之后。

在调用通知方法之前,我的示例中的初始化的第一阶段已完成。并且,如下所示,我也尝试直接调用通知。视图控制器也没有采取任何操作 - 虽然在初始化之后调用时,视图控制器会按预期响应。

这是我应该报告的错误吗?或者我只是在关于初始化的简单事情上有一个脑子死亡的时刻?

以下是相关的型号代码:

class Model {

    let notificationONEName = Notification.Name("NotificationONE")
    let notificationTWOName = Notification.Name("NotificationTWO")

    init() {
        notifyObserversTWO()
        NotificationCenter.default.post(name: notificationTWOName, object: self)
    }

    func notifyObserversONE() {
        print("START \(Model.self).\(#function)")
        NotificationCenter.default.post(name: notificationONEName, object: self)
        print("END \(Model.self).\(#function)")
    }
}

而且,这里是视图控制器中的观察者代码:

import UIKit

class ViewController: UIViewController {

    let notificationONESelector = #selector(didReceiveNotificationONE)
    let notificationTWOSelector = #selector(didReceiveNotificationTWO)

    let model = Model()

    override func viewDidLoad() {
        super.viewDidLoad()

        subscribeToNotifications()
        model.notifyObserversONE()
        model.notifyObserversTWO()
    }

    func subscribeToNotifications() {
        NotificationCenter.default.addObserver(self,
                                           selector: notificationONESelector,
                                           name: model.notificationONEName,
                                           object: model)

        NotificationCenter.default.addObserver(self,
                                           selector: notificationTWOSelector,
                                           name: model.notificationTWOName,
                                           object: nil)
    }

    @objc func didReceiveNotificationONE(notification: Notification) {
        print("START \(ViewController.self).\(#function)")
        exampleUtilityFunction()
        print("END \(ViewController.self).\(#function)")
    }

    @objc func didReceiveNotificationTWO(notification: Notification) {
        print("START \(ViewController.self).\(#function)")
        exampleUtilityFunction()
        print("END \(ViewController.self).\(#function)")
    }

    func exampleUtilityFunction() {
        print("START \(ViewController.self).\(#function)")
        print("END \(ViewController.self).\(#function)")
    }
}

1 个答案:

答案 0 :(得分:0)

在调用Model.init时,没有任何东西在观察它。在致电subscribeToNotifications之后不久,您就不会致电Model()

如果您想回复此通知,则首先需要在调用object: nil之前观察init(与第二次通知一样)。这意味着您无法在属性定义中初始化它。您需要致电subscribeToNotifications,然后创建model