Cocoa GCD挂在菜单栏应用程序中

Cocoa GCD挂在菜单栏应用程序中,cocoa,swift3,Cocoa,Swift3,我有一个菜单栏应用程序,它不知从哪里(没有代码更改)停止工作。奇怪的是,一旦我选择它,或者如果我使用任何系统键(音量、亮度、iTunes等),该应用程序就会继续执行。我的代码使用GCD来管理行为。有没有办法调试一下,看看幕后发生了什么?我的困惑是为什么使用系统键(弹出一个窗口来显示音量、亮度)会让我的软件继续运行 DispatchQueue.main.async() { doSomething() } func doSomething() { //run a bunch of thin

我有一个菜单栏应用程序,它不知从哪里(没有代码更改)停止工作。奇怪的是,一旦我选择它,或者如果我使用任何系统键(音量、亮度、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
    }
}

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

从同一队列(
AnyQueue
)调用
AnyQue.sync
)会导致死锁,因为调用任务正在等待被调用的任务。但被叫方将在被叫方完成后启动

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

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

DispatchQueue.main.async() {
    doSomething()
}
印刷品:

tag1
tag2

我弄明白了,我有一个CFRunLoop正在运行,需要停止,然后现在一切似乎都正常了。另外,整个进程作为后台调度进程运行,这就是使用sync工作的原因

(1)我给你的是我认为重要的代码部分。有一个函数以异步方式运行,并尝试以同步挂起方式运行某些块。(2) 调用async挂起在同一个位置。“我给你的代码中我认为重要的部分”我知道这一点。我想说的是你错了。如果你知道什么是重要的,你就会解决你自己的问题。我试过异步,但还是一样的问题。此外,在按下任何系统键后,该过程将继续(无论同步还是异步)。这就是让我感到困惑的部分。我的样本是否没有在您的系统上打印
tag2
,或者您的帧更新
self.window.frame=fooFrame
不工作?它没有打印tag2。它在操场上工作,但当应用程序更改为UIElement类型时,它似乎停止工作。它是一个菜单项应用程序。我将不得不对此进行更多的研究。请通过info.plist更新您如何“更改为UIElement类型”的问题。应用程序始终是UIElement。我没有动态地改变它或任何东西。