在其中一个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
?
答案 0 :(得分:2)
是的,您必须使用主队列来更新tableview。任何UI更新都应该在主线程上执行。
所以你必须在主线程上重新加载表。
dispatch_async(dispatch_get_main_queue(), ^{
// Perform UI operations here
});
建议在执行与UIKit
相关的操作时,在辅助线程或后台线程上执行所有计算,网络相关功能,然后使用上述代码简单切换回主线程。