帮助iOS上的多线程?

时间:2010-12-05 19:05:59

标签: iphone multithreading ios nsthread

我有一个使用OpenEars和Flite库的应用程序。问题是Flite库是资源密集型的,它冻结了我的应用程序。我怀疑在后台线程上运行Flite会解决问题,但我没有想法如何做到这一点。

那就是说, 如何在iOS中实现后台线程

如果有人能指点我一些教程,分享一些示例代码或任何有助于我解决此问题的一般建议,我将不胜感激。

3 个答案:

答案 0 :(得分:45)

Apple的Concurrency Programming Guide读起来很不错。通过从Web上复制一些示例代码并进行黑客攻击直到您满意为止,并发编程并不是您想要的。了解避免麻烦的选项和原则是很好的。


一段时间后重新回答答案,现在使用Grand Central Dispatch几乎不会出错。在后台运行任务看起来像这样:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self doSomeLongTask]; // 1
    dispatch_async(dispatch_get_main_queue(), ^{
        [self longTaskDidFinish]; // 2
    });
});

长任务(1)将在某个后台线程上运行,并且没有我知道的捕获,即。在该线程中已经存在自动释放池,您不必关心运行循环等。任务完成后,代码在主线程(2)上调用-longTaskDidFinish,以便您可以更新UI或其他任何内容。这是一种常用的习语。

答案 1 :(得分:6)

也许最好的办法是this tutorial from Apple。我仔细阅读(10-20分钟)并“完成”我的所有申请!优良!

答案 2 :(得分:1)

Swift 3

DispatchQueue.global(qos: .userInteractive).async {
    // Code to run on background thread

    // Switch to the main UI thread to display any results needed
    DispatchQueue.main.async {
        // Run code on main UI thread here
    }
}

qos参数代表“服务质量”。把它当作优先考虑给你的后台线程:

  • .userInteractive(最高优先级)
  • .userInitiated(当你可以节省几秒钟时)
  • .utility(当你可以节省几秒到几分钟时)
  • .background(最低优先级 - 分钟/小时)