帮助在iOS上的multithreading?
我有一个使用OpenEars和Flite库的应用程序。 问题是Flite库是资源密集型的,它冻结了我的应用程序。 我怀疑在后台线程上运行Flite会解决问题,但我不知道如何去做。
这就是说, 我如何在iOS中实现后台线程 ?
我会很感激,如果有人能指点我一些教程,分享一些示例代码,或任何一般的build议,可以帮助我解决这个问题。
苹果的并发编程指南是一个不错的阅读。 并发编程不是你可能想要从networking上复制一些示例代码和黑客直到你快乐。 了解避免麻烦的select和原则是很好的。
一段时间后重新回答,现在你几乎不会用大中央调度出错。 在后台运行任务如下所示:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self doSomeLongTask]; // 1 dispatch_async(dispatch_get_main_queue(), ^{ [self longTaskDidFinish]; // 2 }); });
长期任务(1)将在一些后台线程上运行,并且没有我知道的捕获,即。 在那个线程中已经有了一个autorelease池,你不必关心运行循环等等。在任务完成之后,代码在主线程(2)上调用-longTaskDidFinish
,这样你就可以更新UI或其他任何东西。 这是一个常用的习惯用语。
也许最好的办法是从苹果的教程 。 我仔细阅读(10-20分钟)和“线程”我所有的应用程序! 优秀!
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
(当你可以.utility
几秒到几分钟) -
.background
(最低优先级 – 分钟/小时备用)