2014-01-07 91 views
0

我正在使用以下代码调用主线程中dispatch_async内部的[self.tableView reloadData]方法。它工作正常,并按预期。在Web服务异步回调上更新UITableView

-(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

你总是想确保你在主线程UI更新,所以你对做dispatch_async是正确的。不过,有一件事是关于你的代码的:你正在执行dispatch_async来重新加载块中的表,所以这是为块的每一次执行都做的。您只需要执行一次,因此我建议将dispatch_async移至enumerateObjectsUsingBlock以下。这还可以确保在主线程获取它来更新表时,您不会在后台线程上更新_genres。

+0

将呼叫移到枚举之外的好通话。我忽略了那个细节。 – rmaddy

+0

谢谢!接得好!我修好了:) –

0

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