2014-01-07 52 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()...的使用是正確的。