0

想通过UICollectionView实现图库。我在一个数组中有一组图像 url,比如大约 20-30 个 url。使用 SDWebImageManager 下载图像并将其缓存并显示在集合视图上。

请参阅下面的代码:

for(int i=0;i<[imagePath count];i++) {

    [manager downloadWithURL:[NSURL URLWithString:[imagePath objectAtIndex:i]] options:0 progress:^(NSUInteger receivedSize, long long expectedSize) {

    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {

        if(image){
            NSLog(@"SUCCESS");
            NSString *localKey = [NSString stringWithFormat:@"Item-%d", i];
            NSLog(@"%@",localKey);
            [[SDImageCache sharedImageCache] storeImage:image forKey:localKey];
        }

    }];
}

它所做的只是在我的 imagePath 数组中显示第一个 url 链接索引为 0 的图像,并且单元格的其余部分保持空白。当尝试打印时,它只显示一次成功和 Item-0。我想它不会再进一步​​了。它只下载一个图像(数组中的第一个 url 图像)。请帮我解决一下这个。很长一段时间以来,我一直对此感到头疼。不确定我是否走在正确的轨道上。或者请建议我通过存储在数组中的多个 url 来实现图片库的其他替代方案。

4

1 回答 1

0

我不得不想知道你cellForItemAtIndexPath在做什么。cellForItemAtIndexPath如果它试图直接从缓存中检索图像,您可能会准确地看到您描述的行为(上面的代码异步运行,因此在尝试从缓存中检索图像时尚未下载图像)。

就个人而言,我建议您甚至不要费心尝试提前填充缓存。只需cellForItemAtIndexPath使用UIImageView+WebCache类别方法setImageWithURL并完全删除for问题中的循环即可。它会自动为您填充缓存,丢失图像的问题可能会消失。

如果您在检索图像时遇到问题,您应该使用一种将NSError对象传递回块的 SDWebImage 方法。例如:

[cell.imageView setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
    if (error)
        NSLog(@"%s: setImageWithURL error: %@", __FUNCTION__, error);
}];

如果 URL 地址无效,您可能会看到 404 错误。


如果你决定使用你的for循环,还有一些其他的想法:

  1. 顺便说一句,只有在imagenil. 您可能希望else您的if陈述失败(例如,error对象可以告诉您一些有趣的事情)。如果 API 提供了一个error对象,你应该利用它。

  2. 获取下载的图像并使用另一个键将其添加到缓存中有点好奇;现在您的缓存中有两个图像副本,这是对空间的浪费。下载图像后,它已经在缓存中,如果您尝试使用相同的 URL 再次检索图像,它将从缓存中拉取图像。使用您自己的密钥在缓存中创建另一个条目是没有意义的。

  3. 如果您不打算使用该progress块,则可以只传递nil该参数。

于 2013-07-03T13:14:19.717 回答