在Web服务异步回调上更新UITableView

时间:2014-01-07 19:27:25

标签: ios uitableview grand-central-dispatch

我使用以下代码调用主线程上[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)的原因

2 个答案:

答案 0 :(得分:2)

您始终希望确保在主线程上进行UI更新,因此您正确地执行dispatch_async。但是关于你的代码的一件事是:你正在使用dispatch_async来重新加载块中的表,所以它正在为块的每次执行执行它。您只需要执行一次,因此我建议将dispatch_async移至enumerateObjectsUsingBlock的调用下方。这也确保您在主线程更新表时不会在后台线程上更新_genres。

答案 1 :(得分:0)

您必须更新主线程上的UI。如果在后台线程上调用响应块,那么您对dispatch_async(dispatch_get_main_queue()...的使用是正确的,也是必需的。