我有一个使用OpenEars和Flite库的应用程序。问题是Flite库是资源密集型的,它冻结了我的应用程序。我怀疑在后台线程上运行Flite会解决问题,但我没有想法如何做到这一点。
那就是说, 如何在iOS中实现后台线程 ?
如果有人能指点我一些教程,分享一些示例代码或任何有助于我解决此问题的一般建议,我将不胜感激。
答案 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)
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
(最低优先级 - 分钟/小时)