2017-10-17 8 views
0

아래의 간단한 Swift 4 예제는 컴퓨터 디스플레이가 절전 모드로 전환 될 때 중지되어야합니다.Swift에서 NSWorkspace 알림 수신 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 루프에서 중단됩니다. 내가 뭘 잘못하고 있으며, 통지를 기다리는 적절한 방법은 무엇입니까?

나는 셀렉터 (, 물론 함수 선언에 @objc)를 사용해 보았지만 아무 소용이 없다.

+0

while을 사용하여 실행하려면 왜 처음부터 알림 관찰자 개체를 만들어야합니까? –

+0

이것은 단지 예입니다. 그러나 수면 상태를 수동으로 확인하는 방법을 찾지 못했습니다. 알림을 사용하는 것 이외의 다른 방법이 있다면 설명을 어디에서 찾을 수 있는지 말해 줄 수 있습니까? 감사. @ElTomato –

답변

0
은 엑스 코드에서 템플릿 응용 프로그램을 시작하고이 작업을 수행 할 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. 
     } 
    } 


} 
코드와 내 사이의 차이가 나는 당신이하고있는 엉뚱한 졸린 폴링 일을하고 있지 않다 때문이다

(회전하는 피자 커서로 이어질 것입니다) 그리고 ViewController 개체의 속성이되도록 observer을 설정하므로보기 컨트롤러가 수행하는 동안 observer 속성이 계속 붙습니다.

+0

viewDidLoad로 알림을 보는 것이 올바르게 들리지 않습니다. –

+0

'Observer' 클래스가 설정되는 방식으로'viewDidLoad'는'addDNC'를 호출 할만큼 좋은 장소라고 생각했습니다. 이것이 내 코드라면 별도의 클래스를 사용하지 않고 직접 관찰자를 설정할 수 있습니다. 너 무슨 생각 했니? –

+0

실제 앱에 옵저버가 있다면, 당신이 해낸 방식대로 작동합니다. 내 예제의 while 루프는 실제로 프로그램을 멈추게함으로써 관찰자가 작동하지 못하게한다고 생각합니다. (대답이 늦어서 답을 표시하지 않았다는 것을 깨달았 기 때문에) –