StatusBarIcon与Dropbox类似的行为

时间:2016-11-26 16:26:11

标签: swift xcode macos swift3 macos-sierra

我想创建一个仅每隔30秒检查和API的MenuBar应用程序,并根据标志的状态更改StatusBarIcon。我一直在关注本教程:https://nsrover.wordpress.com/2014/10/10/creating-a-os-x-menubar-only-app/但我第一次只能在applicationDidFinishLaunching函数中执行此操作。

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Insert code here to initialize your application

    statusBarItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
    statusBarItem?.image = #imageLiteral(resourceName: "locked")


    self.fetchOccupied { (occupied) in
        if (occupied) {
            self.statusBarItem?.image = #imageLiteral(resourceName: "locked")
        } else {
            self.statusBarItem?.image = #imageLiteral(resourceName: "unlocked")
        }
    }
}

之后,就像我说的那样,我想每30秒再次检查一次,而不必点击StatusBarItem,但是我不能将循环放在该函数中,因为那时应用程序永远不会启动。

我不知道在哪里放置循环因为我没有主ViewController或任何东西。我只有AppDelegate类和XIB文件。

在哪里可以创建循环开启的功能?也许我可以将该循环异步放在applicationDidFinishLaunching函数中?

谢谢。

2 个答案:

答案 0 :(得分:0)

var timer: DispatchSourceTimer?

func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application

    self.timer = DispatchSource.makeTimerSource(flags: DispatchSource.TimerFlags(), queue: DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated))
    self.timer?.scheduleRepeating(deadline: DispatchTime.now(), interval: DispatchTimeInterval.seconds(30), leeway: DispatchTimeInterval.seconds(0))
    self.timer?.setEventHandler(handler: {
        //loop body here
        print("timer fire", separator: "", terminator: "\n")
    })
    self.timer?.resume()
}

答案 1 :(得分:0)

您可以只运行一个时钟,每隔30秒收到一次通知。

power(0, 0) == 1