iOS dispatch_async,在iOS 4上崩溃

时间:2012-07-01 18:36:04

标签: objective-c ios

我正在向不同线程上的服务器发出服务器请求。当它们完成加载时,我得到一个更新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设备上正确运行?

提前致谢。

1 个答案:

答案 0 :(得分:2)

DISPATCH_QUEUE_PRIORITY_BACKGROUND仅适用于iOS 5及更高版本

来自apple docs

  

DISPATCH_QUEUE_PRIORITY_BACKGROUND分派给队列的项目   在后台优先;毕竟队列计划执行   已安排高优先级队列,系统将运行项目   一个优先级设置为后台状态的线程。这样的线程   具有最低优先级,并且任何磁盘I / O都被限制以最小化   对系统的影响。适用于iOS 5.0及更高版本。

因此,如果您正在考虑分发iOS 4的应用程序,那么您无法使用它

来源apple docs

但是,如果删除DISPATCH_QUEUE_PRIORITY_BACKGROUND,则当前代码将仅在主ui线程中运行,这可能会导致您在执行远程请求时速度变慢