首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift 4中侦听NSWorkspace通知

在Swift 4中侦听NSWorkspace通知
EN

Stack Overflow用户
提问于 2017-10-17 02:51:27
回答 1查看 1.7K关注 0票数 1

下面这个简单的Swift 4示例应该在计算机的显示器进入休眠状态时停止。

代码语言:javascript
复制
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 ),但没有效果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-17 03:24:06

在Xcode中启动一个模板应用程序,并修改ViewController.swift以完成以下操作:

代码语言:javascript
复制
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属性就会继续存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46781766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档