我是否需要在完成块中使用dispatch_get_main_queue

时间:2016-09-06 10:38:31

标签: ios swift multithreading

在其中一个tutorial from Ray Wenderlich Series,中,他在完成块中使用了dispatch_get_main_queue(),如下所示

func startFiltrationForRecord(photoDetails: PhotoRecord, indexPath: NSIndexPath){
  if let filterOperation = pendingOperations.filtrationsInProgress[indexPath]{
    return
  }

  let filterer = ImageFiltration(photoRecord: photoDetails)
  filterer.completionBlock = {
    if filterer.cancelled {
      return
    }
    dispatch_async(dispatch_get_main_queue(), {
      self.pendingOperations.filtrationsInProgress.removeValueForKey(indexPath)
      self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
      })
  }
  pendingOperations.filtrationsInProgress[indexPath] = filterer
  pendingOperations.filtrationQueue.addOperation(filterer)
}

尽管他简要解释了为什么需要完成模块,但我想知道是否有人可以回答以下问题

在我自己的应用程序中,我在很多地方都有完成块(在他的完成块中重新加载表视图代码。但是,我没有一个dispatch_get_main_queue代码。这是否意味着所有UI相关完成块中的任务,我需要添加dispatch_get_main_queue

1 个答案:

答案 0 :(得分:2)

是的,您必须使用主队列来更新tableview。任何UI更新都应该在主线程上执行。

所以你必须在主线程上重新加载表。

dispatch_async(dispatch_get_main_queue(), ^{

            // Perform UI operations here
        });

建议在执行与UIKit相关的操作时,在辅助线程或后台线程上执行所有计算,网络相关功能,然后使用上述代码简单切换回主线程。