我有一个菜单栏应用程序,它无处不在(没有代码更改)停止工作。奇怪的是,一旦我选择它,或者如果我使用任何系统键(音量,亮度,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
}
}
此外,我没有收到任何消息或异常。只是应用程序冻结。我还注意到,如果我有多个显示器并激活第二个显示器,菜单栏会激活,那么我的过程会再次继续,一切正常。
答案 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运行需要停止,然后一切似乎现在工作正常。此外,整个过程作为后台调度过程运行,这就是使用同步工作的原因。