6

我正在尝试加载一堆图像:

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) { }];
}

然后它工作得很好。我的问题是:为什么?有一个更好的方法吗?传入一个空块对我来说似乎不合适。

4

3 回答 3

19

您使用的 API 不正确。

要预取图像并将它们存储在缓存中,请使用SDWebImagePrefetcher它。

NSMutableArray * urls = [NSMutableArray arrayWithCapacity:things.count];
for (NSDictionary *s in things) {
    [urls addObject:[NSURL URLWithString:s[photo]]];
}
[[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:urls];

作为旁注,我提交了一个拉取请求 - 刚刚合并 - 以强制在completedBlock您正在(错误)使用的 API 中存在 a,以便其他程序员不会让您陷入同样的​​错误。

于 2013-08-29T14:50:38.433 回答
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所以是的,如果is ,它什么都不做nil。为什么?可能,SDWebImage开发人员认为如果没有传递该参数,该方法将毫无用处。你最好创建一个 GitHub 问题来询问他们。

于 2013-08-29T11:33:52.447 回答
1

SDWebImage 已修复完成块问题,现在只需一行 Swift 即可实现:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray)
于 2018-02-04T21:14:09.803 回答