libdispatch不需要調用dispatch_main()
,它通過調度主隊列主線程的runloop集成,見dispatch_get_main_queue(3)
和COMPATIBILITY
部分在其中。
不調用dispatch_main()
並且想要使用主隊列的可執行文件必須以調度主隊列上要處理的塊的通用模式之一運行主線程runloop;通過標準框架方法(例如NSApplicationMain()
)或直接通過CFRunLoop或NSRunLoop API進行間接。
請不要試圖使用_dispatch_main_queue_callback_4CF
符號,它是庫內部的實現細節,將來很可能會發生更改,並且任何依賴它的代碼都會在沒有警告的情況下中斷。
將libdispatch與自定義非主線程CFRunLoops集成可以通過多種方式實現,例如通過CFRunLoopPerformBlock()
API或自定義runloop源。
更新:在Linux上,你就必須修改libdispatch來源,有一個自定義的互操作沒有現有的支持runloops AFAIK。
到主隊列在Linux上現有的runloop整合最簡單的方法可能是的確將是通過事件循環每次調用(最好改名)_dispatch_main_queue_callback_4CF()
功能,並更換 _dispatch_queue_wakeup_main()
用任何方法是適當的喚醒你的runloop(例如寫入runloop正在等待的管道)。
來源
2012-04-24 05:30:49
das
我想在Linux系統上使用libdispatch(如果是NSRunLoop/CFRunLoop限制)。我想我應該在我原來的帖子中更清楚一點。我正在使用Debian libdispatch源代碼(libkern/libpthread_workqueue/libkqueue)。 – Buzzy 2012-04-24 06:08:36
這完全正確。我自己也是到了類似的解決方案。萬分感謝! – Buzzy 2012-04-24 07:11:11