在 Swift 4 中监听 NSWorkspace 通知
Listening for NSWorkspace Notifications in Swift 4
下面的简单 Swift 4 示例应该会在计算机显示器进入睡眠状态时停止。
class Observer {
var asleep = false
func addDNC () {
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.screensDidSleepNotification, object: nil, queue: nil, using: notificationRecieved)
}
func notificationRecieved (n: Notification) {
asleep = true
}
}
let observer = Observer ()
observer.addDNC ()
while (!observer.asleep) {}
print ("zzzz")
但是,程序卡在了 while 循环中。我做错了什么,等待通知的正确方法是什么?
我试过使用选择器(#selector (notificationRecieved)
,当然在函数声明中使用 @objc
),但无济于事。
在 Xcode 中启动模板应用程序并修改 ViewController.swift 以执行此操作:
import Cocoa
class Observer {
var asleep = false
func addDNC () {
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.screensDidSleepNotification, object: nil, queue: nil, using: notificationRecieved)
}
func notificationRecieved (n: Notification) {
print("got sleep notification!")
asleep = true
}
}
class ViewController: NSViewController {
let observer = Observer ()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
observer.addDNC ()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
你的代码和我的代码之间的区别在于我没有做你正在做的古怪的昏昏欲睡的轮询(这会导致旋转的披萨光标),而且我还设置了 observer
成为 ViewController
对象的 属性,因此 observer
属性 只要视图控制器存在,就会一直存在。
下面的简单 Swift 4 示例应该会在计算机显示器进入睡眠状态时停止。
class Observer {
var asleep = false
func addDNC () {
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.screensDidSleepNotification, object: nil, queue: nil, using: notificationRecieved)
}
func notificationRecieved (n: Notification) {
asleep = true
}
}
let observer = Observer ()
observer.addDNC ()
while (!observer.asleep) {}
print ("zzzz")
但是,程序卡在了 while 循环中。我做错了什么,等待通知的正确方法是什么?
我试过使用选择器(#selector (notificationRecieved)
,当然在函数声明中使用 @objc
),但无济于事。
在 Xcode 中启动模板应用程序并修改 ViewController.swift 以执行此操作:
import Cocoa
class Observer {
var asleep = false
func addDNC () {
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.screensDidSleepNotification, object: nil, queue: nil, using: notificationRecieved)
}
func notificationRecieved (n: Notification) {
print("got sleep notification!")
asleep = true
}
}
class ViewController: NSViewController {
let observer = Observer ()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
observer.addDNC ()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
你的代码和我的代码之间的区别在于我没有做你正在做的古怪的昏昏欲睡的轮询(这会导致旋转的披萨光标),而且我还设置了 observer
成为 ViewController
对象的 属性,因此 observer
属性 只要视图控制器存在,就会一直存在。