有没有一种方法可以监听NSApplicationDelegate applicationDidFinishLaunching和applicatonWillTerminate调用?

时间:2020-09-04 15:57:42

标签: swift notifications

我的用例是,我有一个对象,需要在应用程序启动时自行设置,并在应用程序即将退出时自行关闭。当前,我在应用程序委托的applicationDidFinishLaunchingapplicationWillTerminate方法中调用了“ setup”和“ teardown”方法。但是我发现我越来越遵循这种模式,因此在应用程序委托方法中得到了“ setup”和“ teardown”调用字符串。

我想做的是通过让我的对象自动“注册”自己以监听应用程序委托方法来对此进行形式化。显然,我可以自己定义必要的基础结构,方法是定义一个侦听器和一个帮助程序类,委托可以从该类中派生该类以进行处理。

但是,我想知道是否有一种方法可以让我的对象注册以接收相同的通知,从而导致调用应用程序委托方法而不必实际引用应用程序委托本身?

我希望下面的代码可以工作,但不能。我从没收到“明白了”的消息。

public override init() {
    super.init()
    print("!! registering, delegate=\(NSApplication.shared.delegate)")
    DistributedNotificationCenter.default().addObserver(
        NSApplication.shared,
        selector: #selector(self.myObservedEvent(notification:)),
        name: NSApplication.didFinishLaunchingNotification,
        object: nil
        )
}

@objc func myObservedEvent(notification: Notification) {
    print("!!! got it")
}

我认为或者我在注册时做错了什么,可能有一个简单的解决方法,或者init方法太早了,无法执行注册。 (应用程序委托在调用时为nil,这是有道理的,因为我的对象是委托对象的属性。要回答一个明显的问题,是我的对象是从NSObject继承而来的。)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

没关系,我想通了。我使用了错误的通知中心,并传递了错误的对象。以下代码实现了我想要的:

public override init() {
    super.init()
    print("!! registering, delegate=\(NSApplication.shared.delegate)")
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.myObservedEvent(notification:)),
        name: NSApplication.didFinishLaunchingNotification,
        object: nil
        )
}

@objc func myObservedEvent(notification: Notification) {
    print("!!! got it")
}