GCD挂在菜单栏应用程序中

时间:2016-11-29 18:34:53

标签: cocoa swift3

我有一个菜单栏应用程序,它无处不在(没有代码更改)停止工作。奇怪的是,一旦我选择它,或者如果我使用任何系统键(音量,亮度,iTunes等),应用程序将继续执行。我的代码使用GCD来管理行为。有没有办法调试这个,看看幕后发生了什么?我的困惑是为什么使用系统键(弹出一个窗口显示音量,亮度等级)使我的软件继续执行?

DispatchQueue.main.async() { doSomething() }

func doSomething() {
    //run a bunch of things in a background process
    //so far works ok

    let fooFrame = NSMakeRect(0, 0, 100, 100)

    print("tag1") //this prints just fine

    DispqtchQueue.main.sync() {
        print("tag2") //this doesn't print and doesn't execute until I click on the app or use the volume keys.
        //run code to update UI works fine once I use volume keys (no idea why)

        self.window.frame = fooFrame
    }
}

此外,我没有收到任何消息或异常。只是应用程序冻结。我还注意到,如果我有多个显示器并激活第二个显示器,菜单栏会激活,那么我的过程会再次继续,一切正常。

2 个答案:

答案 0 :(得分:0)

从同一队列(AnyQue.sync)调用AnyQueue会导致死锁,因为调用任务正在等待被调用的任务。但被呼叫者将在呼叫结束后开始。

正如matt所写,使用async解决了这个问题。这段代码:

func doSomething() {
    print("tag1")
    DispatchQueue.main.async() {
        print("tag2")
    }
}

DispatchQueue.main.async() {
    doSomething()
}

打印:

tag1
tag2

答案 1 :(得分:-1)

想出来,我有一个CFRunLoop运行需要停止,然后一切似乎现在工作正常。此外,整个过程作为后台调度过程运行,这就是使用同步工作的原因。