我正在向不同线程上的服务器发出服务器请求。当它们完成加载时,我得到一个更新tableView的委托回调。起初,我注意到一些奇怪的行为,并认为这可能是因为主线程上没有执行某些UI元素。
我添加了下面的代码,解决了这个问题,但代码在iOS 4设备上崩溃了(原来DISPATCH_QUEUE_PRIORITY_BACKGROUND与iOS 4不兼容)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
//Update view code etc...
});
});
如果我删除了第一个dispatch_async
,并且只调用dispatch_get_main_queue
,则代码运行良好:
dispatch_async(dispatch_get_main_queue(), ^(void) {
//Update view code etc...
});
在将更新发送给Apple之前,我想问一下这是否可行?代码是否可以在iOS 4设备上正确运行?
提前致谢。
答案 0 :(得分:2)
DISPATCH_QUEUE_PRIORITY_BACKGROUND
仅适用于iOS 5及更高版本
来自apple docs
DISPATCH_QUEUE_PRIORITY_BACKGROUND分派给队列的项目 在后台优先;毕竟队列计划执行 已安排高优先级队列,系统将运行项目 一个优先级设置为后台状态的线程。这样的线程 具有最低优先级,并且任何磁盘I / O都被限制以最小化 对系统的影响。适用于iOS 5.0及更高版本。
因此,如果您正在考虑分发iOS 4的应用程序,那么您无法使用它
但是,如果删除DISPATCH_QUEUE_PRIORITY_BACKGROUND
,则当前代码将仅在主ui线程中运行,这可能会导致您在执行远程请求时速度变慢