gpt4 book ai didi

iphone - 将自定义运行循环与 libdispatch 集成

转载 作者:IT王子 更新时间:2023-10-29 01:02:46 26 4
gpt4 key购买 nike

我正在尝试构建一个必须管理自己的运行循环的应用程序。我想在此应用程序中使用 libdispatch。但是,使用 libdispatch 需要调用 dispatch_main() ,这是一种阻塞方法。我不能在主线程上阻塞。

  1. 有没有办法在不使用阻塞 dispatch_main() 的情况下将自定义运行循环与 libdispatch 集成?
  2. 我在 libdispatch 的 queue.c 中看到对 _dispatch_main_queue_callback_4CF 的引用,看起来很有希望。有没有办法使用这种方法来达到同样的目的?有关此方法的文档非常少。
  3. 理想情况下,我不需要使用 NSRunLoop/CFRunLoop。

最佳答案

libdispatch 不需要调用dispatch_main(),它通过调度主队列与主线程的runloop集成,参见dispatch_get_main_queue(3)COMPATIBILITY 部分。

不调用 dispatch_main() 并且想要使用主队列的可执行文件必须以一种常见模式运行主线程 runloop,以便处理调度主队列上的 block ;间接通过标准框架方法(例如 NSApplicationMain())或直接通过 CFRunLoop 或 NSRunLoop API。

请不要尝试使用 _dispatch_main_queue_callback_4CF 符号,它是库内部的一个实现细节,将来很可能会发生变化,任何依赖它的代码都会在没有警告的情况下中断。

libdispatch 与自定义非主线程 CFRunLoop 的集成可以通过多种方式实现,例如通过 CFRunLoopPerformBlock() API 或自定义 runloop 源。


更新:在 Linux 上,您必须修改 libdispatch 源,目前不支持与自定义运行循环 AFAIK 进行互操作。

在 Linux 上将主队列与现有运行循环集成的最简单方法可能确实是每次通过事件循环调用(最好重命名)_dispatch_main_queue_callback_4CF() 函数,并替换_dispatch_queue_wakeup_main() 使用任何适合唤醒 runloop 的方法(例如,写入 runloop 正在等待的管道)。

关于iphone - 将自定义运行循环与 libdispatch 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com