SDWebImage Загрузка изображения и сохранение в кеш для ключа

17

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

         SDWebImageManager *manager = [SDWebImageManager sharedManager];
         [manager downloadWithURL:[NSURL URLWithString:url] options:0 progress:^(NSUInteger receivedSize, long long expectedSize) {

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

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

          }];  

Есть ли что-то, что я пропустил? Похоже, что это делается в моем инструменте распределения, накапливая много памяти.

    
задан AgnosticDev 15.02.2013 в 21:29
источник

6 ответов

23

Я удивлен, что никто не ответил на этот вопрос, но у меня был аналогичный вопрос, и я столкнулся с этим, поэтому я отвечу на него, чтобы люди рассматривали это в будущем (предполагая, что вы уже разобрали его сами).

Чтобы ответить на ваш вопрос, да, вы дважды копируете изображение.

Загрузка вызовов в SDWebImageManager автоматически кэширует изображения с помощью клавиш на основе абсолютной строки URL-адреса изображения. Если вы хотите свой собственный ключ, вы можете использовать вызов загрузки на SDWebImageDownloader, который, насколько я могу сказать, НЕ кэширует по умолчанию. Оттуда вы можете вызвать sharedImageCache, как вы уже делаете, и кешировать любой желаемый ключ.

В стороне, как это ни странно, вы видите, что накопления накапливаются в любом случае, поскольку SDWebImage любит кэшировать на диск, а не в целом. Может быть, что-то еще происходит в одно и то же время?

Надеюсь, что это поможет,

-Brandon     

ответ дан Stakenborg 22.04.2013 в 21:04
источник
10

В Swift используйте код ниже, чтобы загрузить изображение и сохранить его в кеше:

//SDWebImageManager download image with High Priority 

    SDWebImageManager.sharedManager().downloadImageWithURL(NSURL(string: imageUrl), options: SDWebImageOptions.HighPriority, progress: { (receivedSize :Int, ExpectedSize :Int) in
            SVProgressHUD.show()
            }, completed: { (image :UIImage!, error:NSError!, cacheType :SDImageCacheType, finished :Bool,imageUrl: NSURL!) in
                if(finished) {
                    SVProgressHUD.dismiss()
                    if((image) != nil) {
                        //image downloaded do your stuff
                    }
                }
        })

версия Swift 3 :

SDWebImageManager.shared().downloadImage(with: NSURL(string: "...") as URL!, options: .continueInBackground, progress: { 
(receivedSize :Int, ExpectedSize :Int) in

}, completed: { 
(image : UIImage?, error : Error?, cacheType : SDImageCacheType, finished : Bool, url : URL?) in

})

Версия Objective-C :

[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:imageUrl] options:SDWebImageDownloaderUseNSURLCache progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {

                    if (image && finished) {
                        // Cache image to disk or memory
                        [[SDImageCache sharedImageCache] storeImage:image forKey:CUSTOM_KEY toDisk:YES];     
                    }
                }]; 
    
ответ дан parth 24.11.2016 в 12:10
источник
4

Попробуйте APSmartStorage ( Ссылка ) вместо SDWebImage.

APSmartStorage получает данные из сети и автоматически кэширует данные на диске или в памяти интеллектуальным настраиваемым способом. Должно быть достаточно хорошо для вашей задачи.     

ответ дан slatvick 10.02.2014 в 14:42
источник
4

SDWebImage кэширует изображение как на диск, так и на память. Давайте рассмотрим это:

  1. Загрузите изображение с нового URL-адреса.
  2. Он кэшируется в память и диск.
  3. Если вы вызываете изображение в том же сеансе, оно извлекается из памяти.
  4. Предположим, вы запустили приложение, а затем получили доступ к URL-адресу, он проверит память, где изображения там не будет, тогда он проверит диск и доставит его оттуда. Если нет, он загрузит его.
  5. Изображение сохраняется на диске в течение недели по стандартной настройке.

Итак, вам не нужно беспокоиться о кешировании. SDWebImage заботится о нем довольно хорошо.

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

Вы можете найти полную информацию на странице github здесь .

    
ответ дан Gautam Jain 24.08.2015 в 12:21
источник
0

// СОЗДАТЬ ОБРАТНЫЙ ОБРАЗЕЦ И ПРОХОДИТЬ URL-адрес ИЗОБРАЖЕНИЯ ПО МАССИВУ (INDEXPATH.ROW)

(void) loadImage:(NSString *)imageLink{

    imageLink = [imageLink stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

    SDWebImageManager *manager = [SDWebImageManager sharedManager];

    [manager loadImageWithURL:[NSURL URLWithString:imageLink] options:SDWebImageDelayPlaceholder progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {

    } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {

        imageFrame.image = image;

    }];
}
    
ответ дан Slimshady 14.12.2016 в 22:32
источник
-1
SDWebImageManager *manager = [SDWebImageManager sharedManager];

[manager downloadImageWithURL:ImageUrl options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize)

{


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

    if(image){


        NSLog(@"image=====%@",image);
    }
}];
    
ответ дан Kausik Jati 17.08.2015 в 11:04
источник