2

我有一个使用一些外部库进行分析的应用程序。问题是我怀疑它会同步执行某些操作,这会阻塞我的线程并使看门狗在 10 秒后杀死我的应用程序(0x8badf00d 代码)。真的很难复制(我不能),但是“在野外”很少有案例。

我已经阅读了一些文档,其中建议我应该使用运行循环来代替创建另一个线程。不幸的是,我对他们的了解越多,我就越困惑。我想做的最后一件事是发布一个修复程序,它会破坏更多的东西:/

我想要实现的是:

从主线程向运行循环添加一个任务,它只调用一个函数:initMyAnalytics()。我的线程继续运行,即使 initMyAnalytics() 被锁定等待网络数据。在 initMyAnalytics() 完成后,它会安静地退出并且不再被调用(所以它不会循环或任何东西)。

任何想法如何实现它?欢迎使用代码示例;)问候!

4

1 回答 1

2

在这种情况下,您不需要使用运行循环。运行循环的目的是在特定线程中按顺序处理来自各种来源的事件,并在它们无事可做时保持空闲状态。当然,您可以分离线程、创建运行循环、为函数添加源并运行运行循环直到函数结束。就像您可以使用半挂车将杂货运回家一样。

在这里,您需要的是调度队列。调度队列是异步运行任务的先进先出数据结构。与运行循环相反,调度队列不依赖于特定线程:工作线程会在需要时自动创建和终止。

由于您只有一个任务要执行,因此您不需要创建调度队列。相反,您将使用现有的全局并发队列。并发队列同时执行一个或多个任务,这在我们的例子中非常好。但是如果我们有很多任务要执行,并且希望每个任务都等待其前任结束,我们就需要创建一个串行队列。

所以你所要做的就是:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    initMyAnalytics();
});

DISPATCH_QUEUE_PRIORITY_DEFAULT是一个计算结果为 的宏0。您可以获得具有不同优先级的不同全局队列。第二个参数保留供将来使用,应始终为0.

于 2012-05-29T12:10:58.327 回答