0

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

提前致谢。

4

1 回答 1

2

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

来自苹果文档

DISPATCH_QUEUE_PRIORITY_BACKGROUND 分派到队列的项目以后台优先级运行;在调度所有高优先级队列并且系统在其优先级设置为后台状态的线程上运行项目之后,该队列被调度执行。这样的线程具有最低优先级,并且任何磁盘 I/O 都会受到限制,以尽量减少对系统的影响。在 iOS 5.0 及更高版本中可用。

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

苹果文档

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

于 2012-07-01T18:39:46.427 回答