Есть ли способ предварительно загрузить 1000 изображений с помощью SDWebImage в кеш, не показывая их на экране?

Я использую SDWebImage для загрузки и кэширования изображений. Я хотел бы предварительно загрузить многие изображения в кеш.

Есть ли простой способ сделать это без необходимости отображать изображение пользователю? В настоящее время я использую этот код для отображения:

[anImageView setImageWithURL:[NSURL URLWithString:@"http://www.sameple.com/myimage.jpg"] 
             placeholderImage:[UIImage imageNamed:@"loadingicon.png"]];

person Ethan Allen    schedule 29.04.2014    source источник
comment
Если вы хотите загрузить 1000 изображений, я бы предложил использовать свой собственный метод. Я полагаю, что SDWebImage в какой-то момент начнет очищаться (не могу смотреть на документы atm).   -  person random    schedule 30.04.2014
comment
Я просто хочу, чтобы изображения кэшировались точно так же, как это делает SDWebImage (то же имя и т. д.). Они усовершенствовали свое кэширование... все, что я пишу, может быть подвержено ошибкам, которые они уже исправили.   -  person Ethan Allen    schedule 30.04.2014
comment
Написать собственный загрузчик с кешем для определенной цели легко и просто. Написать загрузчик и кеш для общего доступа к проекту сложно. SDWebImage очень хорош, но никоим образом не идеален. Я бы сказал, что FastImageCache от Path так же хорош, как SDWebImage, хотя я никогда не сравнивал их.   -  person random    schedule 30.04.2014


Ответы (2)


[[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:<NArray with image URLs>];

Это решит проблему одновременной загрузки для вас (maxConcurrentDownloads).

person CEarwood    schedule 29.04.2014
comment
Я бы отметил это как принятый ответ. Он требует минимального количества кода и делает именно то, что задает вопрос. - person Jeff Ames; 18.12.2014

SDWebImageManager — это класс, стоящий за категорией UIImageView+WebCache. Он связывает асинхронный загрузчик с хранилищем кэша изображений. Вы можете использовать этот класс напрямую, чтобы извлечь выгоду из загрузки веб-изображения с кэшированием в другом контексте, чем UIView (т.е. с Cocoa).

Вот простой пример использования SDWebImageManager:

SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadWithURL:imageURL
                 options:0
                 progress:^(NSInteger receivedSize, NSInteger expectedSize)
                 {
                     // progression tracking code
                 }
                 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
                 {
                     if (image)
                     {
                         // do something with image
                     }
                 }];

Вы можете запустить и сделать это для каждого изображения ... я не уверен, какова будет производительность для 1000 изображений, и вы захотите убедиться и предупредить своего пользователя о том, что вы собираетесь делать.

Другой подход, основанный на SDWebImage, заключается в том, чтобы управлять своими собственными NSOperationQueue из SDWebImageDownloaderOperation и использовать это из SDImageCache для их сохранения по мере их завершения.

/**
 * Store an image into memory and optionally disk cache at the given key.
 *
 * @param image The image to store
 * @param key The unique image cache key, usually it's image absolute URL
 * @param toDisk Store the image to disk cache if YES
 */
- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk;

Это дало бы вам немного больше контроля над количеством одновременных операций загрузки, а также лучший контроль сохранения состояния.

Взято со страницы GitHub.

person random    schedule 29.04.2014
comment
Спасибо! Я собирался выполнять их один за другим в фоновом режиме, поэтому у меня есть только одно соединение за раз ... Когда одно соединение завершается, я запускаю следующее. Я не хочу заливать фоновые задачи. - person Ethan Allen; 30.04.2014