Cocoa OSX应用程序在dispatch_async上挂起

时间:2015-08-27 12:02:20

标签: multithreading macos cocoa grand-central-dispatch

我的应用程序会触发专门用于检查进程状态的线程。它每隔5-10秒发射一次:

if(!monitorTask){
        MYLog(100,@"Monitor task is dead");
        return;
}
dispatch_async(monitorTask,^{ // fuckup here
        MYLog(150,@"...Checking iTunes");

然而它似乎也常常挂在那里:

enter image description here

任何线索如何解决/捕获这个?这个应用程序是沙滩球,但在Xcode中“运行”就好了 - 坚持这条指令:

enter image description here

2 个答案:

答案 0 :(得分:0)

您确定monitorTask的类型为dispatch_queue_t吗? See these Apple guides for an example of how to create a serial queue

虽然我在评论中看到您正在正确创建队列。

也可以在发送队列之前解除分配队列。您可能需要在队列中perform some memory management以确保在发送之前不会取消分配。

最后重要的是要注意,串行队列大体上用于保护共享资源。如果您只是尝试对资源执行定期检查(一个永远不会写入且只读取的任务),那么您最好使用并发队列(您应该只使用其中一个{{3 }}

或者因为您似乎在应用程序的整个生命周期中一直在检查,您甚至可以考虑使用4 given global queues,,更具体地说是使用Timer Dispatch Source

答案 1 :(得分:0)

我认为这可能是一个Xcode调试器问题,因为我在Xcode之外运行应用程序时无法复制它: - /