我该如何为UITableView设计一个异步图像下载程序,根据表视图中的位置对下载进行优先级排序



在我的应用程序中,我收到一个图像URL列表,用作表视图中的缩略图。表视图有少量的项目,大约30个,所以我想立即加载所有缩略图(而不是当它们变为可见时,因为它们无疑会变为可见,我希望它们在那时完全加载)。

我想按索引路径对图像下载进行优先级排序,所以第一个索引路径的优先级高于第二个,第二个路径的优先级低于第三个,等等

但是,如果我突然跳到表视图的末尾(例如,显示索引路径24-29),我希望这些索引路径的图像成为最高优先级,所以如果它们在一开始就跳,就不必等待所有其他路径先下载。

我该如何设计这样的东西?如果SDWebImage有可能,那就太好了,因为我对此很满意,但如果没有,我完全可以用NSURLSession从头开始创建一些东西。(我看过SDWebImageSDWebImagePrefetcher看起来很有希望,但不允许优先级与我看到的不同。)

我最近遇到了类似的问题,但不需要优先加载。我想不出如何更改加载内容的优先级,除非在加载表视图之前加载缩略图。表视图根据需要加载单元格。

我能想到两种选择:

  1. 如果您希望在加载表视图之前加载并准备好所有数据,请先在早期的视图控制器中加载数据,然后保存数据,以便在包含表视图的视图控制器中将其打开。然后,您的表视图将不必发出任何请求,所有内容都将无缝显示。

  2. tableview异步发送每个缩略图请求,并在图像到达主线程时更新单元格。然后,您可以在图像到达后缓存或保存图像。但这些图像不会立即出现,通常会在一瞬间出现。

我用NSCache做了选项二。键"avatar"的值是缩略图的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"]];
                    }
                });
            }
        }
    });
}

}

相关内容

  • 没有找到相关文章

最新更新