iphone - 使用运行循环联网

标签 iphone ios multithreading

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

我读过一些文档,这些文档建议我应该使用运行循环而不是创建另一个线程。不幸的是,我读得越多,我就越困惑。我想做的最后一件事就是发布一个修复程序,这会破坏更多的东西:/

我想要实现的是:

从主线程向运行循环添加一项任务,该任务仅调用一个函数:initMyAnalytics()。即使 initMyAnalytics() 因等待网络数据而被锁定,我的线程仍会继续运行。 initMyAnalytics() 完成后,它会安静地退出,并且永远不会再次被调用(因此它不会循环或发生任何事情)。

有什么想法可以实现吗?欢迎使用代码示例;) 问候!

最佳答案

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

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

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

所以你所要做的就是:

  • 通过将函数包含在 Block 中来为您的函数创建一个任务
  • 使用dispatch_get_global_queue获取全局队列
  • 使用 dispatch_async 将任务添加到队列。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    initMyAnalytics();
});

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

关于iphone - 使用运行循环联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797208/

相关文章:

iphone - 在 iPhone 中播放蜂鸣声与频率和分贝相关

ios - 无法分发我的应用程序 : "Your app contains non-public API usage."

ios - NSMutableDictionary 给出所有相同的值而不是新的新值

ios - 用户的电子邮件为零 - Firebase,FacebookSDK

android - 插入移动操作系统核心应用程序

java - 从一个非常大的表中获取数据

iphone - 插入命令错误 - Appcelerator Titanium

iphone - 预渲染 UITabBarController View ?

c# - 通过多线程调用静态方法 - 它们可以干扰彼此的输入参数吗

C++ 原子变量可见性