2017-10-17 3 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#selector (notificationRecieved))を使用しようとしましたが、役に立たなくなりました。

+0

whileを実行する場合は、最初に通知オブザーバオブジェクトを作成する必要がありますか? –

+0

これは単なる例です。しかし、私は手動でスリープ状態を確認する方法を見つけることができませんでした。通知以外の方法がある場合は、どこで説明を見つけるか教えてください。ありがとう。 @ElTomato –

答えて

0

スタート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. 
     } 
    } 


} 

あなたのコードと私の間の違いは、私はあなたがやっている奇抜な眠いポーリングことをやっていないよということです(回転ピザカーソルにつながる)、私はViewControllerオブジェクトのプロパティでもあるようにobserverを設定していますので、ビューコントローラが行っている限り、observerのプロパティはそのままです。

+0

viewDidLoadで通知を観察するのは正しいとは言えません。 –

+0

'Observer'クラスの設定方法は、' viewDidLoad'が 'addDNC'を呼び出すのと同じくらい良い場所だと思いました。これが私のコードだったら、別のクラスを使わずにオブザーバを直接セットアップするでしょう。何を考えていたのですか? –

+0

実際のアプリにオブザーバーを置いて、それをやったやり方で、働きました。私の例のwhileループは、実際にオブザーバーがプログラムを停止させることによって動作しないようにしたと思います。 (私はちょうど私が答えたように質問に印をつけていないことを認識したので、 –

関連する問題