我正在努力加载一堆图像:
for (NSDictionary *s in things) {
[manager downloadWithURL:[NSURL URLWithString:s[photo]]
options:0
progress:nil
completed:nil];
}
它没有下载这些图像。但是,如果我传入一个空的完成块,就像这样:
for (NSDictionary *s in things) {
[manager downloadWithURL:[NSURL URLWithString:s[photo]]
options:0
progress:nil
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { }];
}
然后它工作得很好。我的问题是:为什么?有一个更好的方法吗?传入空座对我来说似乎不对。
答案 0 :(得分:18)
您使用的API不正确。
要预取图像并将其存储在缓存中,请使用SDWebImagePrefetcher
。
NSMutableArray * urls = [NSMutableArray arrayWithCapacity:things.count];
for (NSDictionary *s in things) {
[urls addObject:[NSURL URLWithString:s[photo]]];
}
[[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:urls];
作为旁注,我提交了一个拉取请求(刚刚合并),以强制您使用的API中存在completedBlock
,以便其他程序员不会让您失望同样的错误。
答案 1 :(得分:1)
如果仔细查看-[SDWebImageManager downloadWithURL:options:progress:completed:]
implementation,您会找到以下行:
if (!url || !completedBlock || (!(options & SDWebImageRetryFailed) && isFailedUrl))
{
if (completedBlock)
{
// Complain about invalid URL, completely irrelevant to us at this point.
...
}
return operation;
}
是的,如果completionBlock
为nil
则无效。为什么?可能SDWebImage
开发人员认为该方法在没有传递参数的情况下无用。你最好创建一个GitHub问题来问他们。
答案 2 :(得分:0)
SDWebImage修复了完成块问题,现在只需一行Swift即可:
SDWebImagePrefetcher.shared().prefetchURLs(urlArray)