在 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 属性 只要视图控制器存在,就会一直存在。