libdispatch 不需要调用dispatch_main()
,它通过 dispatch 主队列与主线程的 runloop 集成,见dispatch_get_main_queue(3)
和COMPATIBILITY
其中的部分。
不调用dispatch_main()
且想使用主队列的可执行程序必须以常用模式之一运行主线程runloop,以便处理dispatch主队列上的块;通过标准框架方法(例如NSApplicationMain()
)间接或直接通过 CFRunLoop 或 NSRunLoop API。
请不要尝试使用_dispatch_main_queue_callback_4CF
符号,它是库内部的一个实现细节,将来很可能会发生变化,任何依赖它的代码都会在没有警告的情况下中断。
libdispatch 与自定义非主线程 CFRunLoops 的集成可以通过多种方式实现,例如通过CFRunLoopPerformBlock()
API 或自定义 runloop 源。
更新:在 Linux 上,您必须修改 libdispatch 源,不支持与自定义运行循环 AFAIK 进行互操作。
在 Linux 上将主队列与现有 runloop 集成的最简单方法可能确实是_dispatch_main_queue_callback_4CF()
每次通过事件循环调用(最好重命名)函数,并替换
_dispatch_queue_wakeup_main()
为适合唤醒 runloop 的任何方法(例如写入runloop 正在等待的管道)。