2012-04-15 114 views
0

我正在異步加載圖像到UITableView(GCD)上,並且看到一種奇怪的行爲,其中單元格將在多個圖像上「快門」,然後再建立一個圖像。這很難用言語來形容,所以我做了一個屏幕錄製,在這裏你會看到對於一個給定的單元格,多個圖像在它們定位之前會轉移。UITableView異步圖像通過多個圖像加載百葉窗

http://www.youtube.com/watch?v=PKuqng81QX4

我使用隊列來獲取圖像(從REST端點),然後在主隊列設置在單元中的圖像。下面的代碼片段:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

// ..after getting the cell: 

    dispatch_queue_t imageQ = dispatch_queue_create("imageQ", NULL); 
    dispatch_async(imageQ, ^{ 
     NSString *galleryTinyImageUrl = someFunctionToGetThumbnailUrl; 
     NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:galleryTinyImageUrl]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.imageView.image = [UIImage imageWithData:imageData]; 
      [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     }); 
    }); 
    dispatch_release(imageQ); 

,這是得到在短時間內多次調用(即用戶向上彈起在桌子上,引發這些細胞圖像負載30斷火),這一事實令人關切的對我來說是否所有的異步線程「安全地」安全到達應有的位置。我所看到的行爲(在視頻中)似乎證實我在這裏做錯了事。我很感激你可能有的任何細節或廣泛的方法建議。

感謝您的幫助!

回答

2

聽起來像你沒有正確實施細胞重複使用。 確保在通過[tableView dequeueReusableCellWithIdentifier:blah]重複使用單元格時,將單元格圖像設置爲nil,直到新圖像完全下載並準備顯示。

此外,重新使用單元格時,請取消其圖像的潛在運行請求,以防止先前單元格的圖像加載速度較慢,從而覆蓋真實圖像。

+0

謝謝!我添加了'cell.imageView.image = nil;'在獲取一個新的/重用的單元格下面並修復了它! – Steven 2012-04-15 19:06:11

+0

很高興我能幫助你。 – 2012-04-15 19:42:32

+0

如何避免在循環中下載圖像? – mikezang 2012-04-20 12:42:54