2014-04-13 24 views
3

在我的應用程序中,我收到了一張圖像網址列表,用作我的表格視圖中的縮略圖。 tableview有少量的項目,大約30,所以我想立即加載所有的縮略圖(而不是當它們變得可見時,因爲它們無疑將變得可見並且我希望它們完全加載)。我將如何爲我的UITableView設計一個異步圖像下載器,根據表視圖中的位置優先下載?

我想通過索引路徑圖像下載優先級,所以第一個索引路徑在第二,其在第三優先優先等

然而,如果我突然躥到最後的表格視圖(它顯示了,例如,索引路徑24-29)我希望這些索引路徑的圖像成爲最高優先級,所以如果它們在一開始跳躍,他們將不必等待所有其他人下載第一。

我會如何去設計類似的東西?如果SDWebImage可能會很棒,因爲我對此感到滿意,但如果不是的話,我可以用NSURLSession從頭開始創建一些東西。 (我看過SDWebImage,而SDWebImagePrefetcher看起來很有前途,但不允許優先級從我所見過的情況改變。)

+0

'SDWebImage'是使用'NSOperation'子類和'NSOperationQueue',所以你可以,假設,提供'SDWebImageDownloader'公共方法更改操作的隊列優先級。但是,我認爲這不會影響已經執行的操作。我相信你必須取消並重新啓動它們。 –

回答

0

我最近有一個類似的問題,但並不需要優先加載。我想不出如何改變加載內容的優先級,除非你在加載tableview之前加載縮略圖。根據需要使用表格稱重傳感器。

我能想到的兩個選項:

  1. 如果你想把所有的數據加載並準備好實現代碼如下甚至被加載之前,搶先加載在前面的視圖控制器中的數據並將其保存在被打開包含你的表格視圖的視圖控制器。然後,您的tableview不會有任何請求,所有內容都將無縫顯示。

  2. tableview異步發送每個縮略圖請求,並在圖像到達主線程時更新單元格。然後,您可以在圖像到達後緩存或保存圖像。但圖像不會立即出現,通常在一秒之後。

我做了使用NSCache的選項二。關鍵「頭像」的值是縮略圖圖像的URL。此代碼位於我- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

if (![teamMember[@"avatar"] isEqualToString:@""]) { 
    // check for cached image, use if it exists 
    UIImage *cachedImage = [self.imageCache objectForKey:teamMember[@"avatar"]]; 
    if (cachedImage) { 
     cell.memberImage.image = cachedImage; 
    } 
    //else retrieve the image from server 
    else { 
     NSURL *imageURL = [NSURL URLWithString:teamMember[@"avatar"]]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
     // if valid data, create UIImage 
     if (imageData) { 
      UIImage *image = [UIImage imageWithData:imageData]; 
      // if valid image, update in tableview asynch 
      if (image) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        TeamCommitsCell *updateCell = (id)[tableView cellForRowAtIndexPath:indexPath]; 
        // if valid cell, display image and add to cache 
        if (updateCell) { 
         updateCell.memberImage.image = image; 
         [self.imageCache setObject:image forKey:teamMember[@"avatar"]]; 
        } 
       }); 
      } 
     } 
    }); 
} 

}

相關問題