我使用以下代码调用主线程上[self.tableView reloadData]
内的dispatch_async
方法。它工作正常,如预期的那样。
-(void) setup
{
_genres = [NSMutableArray array];
[[MyAppClient sharedClient] getGenres:^(NSURLSessionDataTask *task, id responseObject) {
[responseObject enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
Genre *genre = [[Genre alloc] initWithDictionary:obj];
[_genres addObject:genre];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];
}
即使我在没有dispatch_async
调用的情况下使用它,UITableView
也会重新加载。我的问题是,如果在上述情况中dispatch_async
有任何好处。
我的理由是因为我正在更新主线程上运行的UI
,这就是我使用dispatch_async(main_queue,block)
的原因
答案 0 :(得分:2)
您始终希望确保在主线程上进行UI更新,因此您正确地执行dispatch_async
。但是关于你的代码的一件事是:你正在使用dispatch_async来重新加载块中的表,所以它正在为块的每次执行执行它。您只需要执行一次,因此我建议将dispatch_async
移至enumerateObjectsUsingBlock
的调用下方。这也确保您在主线程更新表时不会在后台线程上更新_genres。
答案 1 :(得分:0)
您必须更新主线程上的UI。如果在后台线程上调用响应块,那么您对dispatch_async(dispatch_get_main_queue()...
的使用是正确的,也是必需的。