Swift 5.1/Cocoa: 如何在 class 中注册一个非 self 的方法作为通知观察者?
Swift 5.1/Cocoa: How do I register a method in a class other than self as a notification observer?
我可以通过传入 self
并在同一 class 中引用方法来建立观察者回调:
func applicationDidFinishLaunching(_ aNotification: Notification) {
DistributedNotificationCenter.default
.addObserver(
self,
selector: #selector(notificationReceived),
name: NSNotification.Name(rawValue: "Hello"),
object: nil)
}
@objc func notificationReceived() {
print("I have received the notification!")
}
//...
在上述情况下,发布通知时会调用 notificationReceived
。但是,如果我想注册属于另一个 class:
的回调,我不能这样做
class Another {
@objc func notificationReceived() {
print("I have received the notification!")
}
}
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
let observer = Another()
DistributedNotificationCenter.default
.addObserver(
observer,
selector: #selector(observer.notificationReceived),
name: NSNotification.Name(rawValue: "Hello"),
object: nil)
}
为什么上面的方法不起作用?将属于self
以外的对象的方法注册为回调,我需要做什么?
这与"another class"无关。它与对象生命周期有关。
您说的是 let observer = Another()
,下一瞬间方法 didFinish
结束,您的 Another 实例 observer
消失在一阵烟雾中。所以通知中心没有人可以与之交谈。没有任何通知到达的机会;观察者在这发生之前就消失了。
(确实,以前你这样做会崩溃,因为你离开通知中心有一个"dangling pointer"。现在你不会崩溃了, 但什么也没有发生。)
self
不是这种情况,不是因为 self
是 "the same class",而是因为它是应用程序委托,它在应用程序的整个生命周期中都存在。
我可以通过传入 self
并在同一 class 中引用方法来建立观察者回调:
func applicationDidFinishLaunching(_ aNotification: Notification) {
DistributedNotificationCenter.default
.addObserver(
self,
selector: #selector(notificationReceived),
name: NSNotification.Name(rawValue: "Hello"),
object: nil)
}
@objc func notificationReceived() {
print("I have received the notification!")
}
//...
在上述情况下,发布通知时会调用 notificationReceived
。但是,如果我想注册属于另一个 class:
class Another {
@objc func notificationReceived() {
print("I have received the notification!")
}
}
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
let observer = Another()
DistributedNotificationCenter.default
.addObserver(
observer,
selector: #selector(observer.notificationReceived),
name: NSNotification.Name(rawValue: "Hello"),
object: nil)
}
为什么上面的方法不起作用?将属于self
以外的对象的方法注册为回调,我需要做什么?
这与"another class"无关。它与对象生命周期有关。
您说的是 let observer = Another()
,下一瞬间方法 didFinish
结束,您的 Another 实例 observer
消失在一阵烟雾中。所以通知中心没有人可以与之交谈。没有任何通知到达的机会;观察者在这发生之前就消失了。
(确实,以前你这样做会崩溃,因为你离开通知中心有一个"dangling pointer"。现在你不会崩溃了, 但什么也没有发生。)
self
不是这种情况,不是因为 self
是 "the same class",而是因为它是应用程序委托,它在应用程序的整个生命周期中都存在。