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

18

Здравствуйте, я использую инфраструктуру 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
источник
  • ___ answer40784884 ___ <div class="post-text" itemprop="text"> <p> В <strong> Swift </strong> используйте код ниже, чтобы загрузить изображение и сохранить его в кеше: </p> %pre% <p> <strong> версия Swift 3 </strong>: </p> %pre% <p> <strong> Версия Objective-C </strong>: </p> %pre%     </DIV> ___ answer16154728 ___ <div class="post-text" itemprop="text"> <p> Я удивлен, что никто не ответил на этот вопрос, но у меня был аналогичный вопрос, и я столкнулся с этим, поэтому я отвечу на него, чтобы люди рассматривали это в будущем (предполагая, что вы уже разобрали его сами). </р> <p> Чтобы ответить на ваш вопрос, да, вы дважды копируете изображение. </p> <p> Загрузка вызовов в SDWebImageManager автоматически кэширует изображения с помощью клавиш на основе абсолютной строки URL-адреса изображения. Если вы хотите свой собственный ключ, вы можете использовать вызов загрузки на SDWebImageDownloader, который, насколько я могу сказать, НЕ кэширует по умолчанию. Оттуда вы можете вызвать sharedImageCache, как вы уже делаете, и кешировать любой желаемый ключ. </P> <p> В стороне, как это ни странно, вы видите, что накопления накапливаются в любом случае, поскольку SDWebImage любит кэшировать на диск, а не в целом. Может быть, что-то еще происходит в одно и то же время? </P> <p> Надеюсь, что это поможет, </p> <p> -Brandon </р>     </DIV> ___ qstntxt ___ <div class="post-text" itemprop="text"> <p> Здравствуйте, я использую инфраструктуру SDWebImage в проекте, и я хочу загружать и кэшировать изображения, но я думаю, что мой код дважды хранит изображение в кеше? Есть ли способ сохранить изображение в кеше одним ключом? Вот мой код. </P> %pre% <p> Есть ли что-то, что я пропустил? Похоже, что это делается в моем инструменте распределения, накапливая много памяти. </P>     </DIV> ___ answer21678842 ___ <div class="post-text" itemprop="text"> <p> Попробуйте APSmartStorage (<a href="https://github.com/Alterplay/APSmartStorage"> Ссылка </a>) вместо SDWebImage. </Р> <p> APSmartStorage получает данные из сети и автоматически кэширует данные на диске или в памяти интеллектуальным настраиваемым способом. Должно быть достаточно хорошо для вашей задачи. </Р>     </DIV> ___ answer32179900 ___ <div class="post-text" itemprop="text"> <p> SDWebImage кэширует изображение как на диск, так и на память. Давайте рассмотрим это: </p> <ol> <li> Загрузите изображение с нового URL-адреса. </li> <li> Он кэшируется в память и диск. </li> <li> Если вы вызываете изображение в том же сеансе, оно извлекается из памяти. </Li> <li> Предположим, вы запустили приложение, а затем получили доступ к URL-адресу, он проверит память, где изображения там не будет, тогда он проверит диск и доставит его оттуда. Если нет, он загрузит его. </Li> <li> Изображение сохраняется на диске в течение недели по стандартной настройке. </li> </ol> <p> Итак, вам не нужно беспокоиться о кешировании. SDWebImage заботится о нем довольно хорошо. </P> <p> Вы можете выполнить собственную реализацию для кэширования, а также обновить изображение из кеша, если хотите, чтобы настройки соответствовали вашему заголовку HTTP-кеширования. </p> <p> Вы можете найти полную информацию на странице github <a href="https://github.com/rs/SDWebImage"> здесь </a>. </p>     </DIV> ___ answer32046454 ___ <div class="post-text" itemprop="text"> %pre%     </DIV> ___ answer41152546 ___ <div class="post-text" itemprop="text"> <p> // СОЗДАТЬ ОБРАТНЫЙ ОБРАЗЕЦ И ПРОХОДИТЬ URL-адрес ИЗОБРАЖЕНИЯ ПО МАССИВУ (INDEXPATH.ROW) </p> %pre%     </DIV> ___ commmment68823617 ___ Да, у быстрой версии есть класс для кэширования изображения с помощью ключа custome. Вы можете использовать ниже код SDImageCache.sharedImageCache (). StoreImage (image, forKey: "(file.attachmentFileName!) _ (File.fileId)") ___ commmment70660612 ___ Удивительный! Кэшированное изображение с помощью настраиваемого ключа. ___ commmment30343379 ___ Прошло некоторое время с тех пор, как я посмотрел на это, но если вы планируете хранить изображение с определенным кеш-ключом, перед выполнением запроса на загрузку необходимо проверить [SDImageCache sharedImageCache] для изображения. Если у вас его нет, сохраните его с помощью своего конкретного ключа, чтобы он был в следующий раз. Это может измениться к настоящему времени, но вы должны использовать SDWebImageDownloader, а затем сохранить свой собственный ключ, если вы собираетесь это делать. ___ qstnhdr ___ SDWebImage Загрузка изображения и сохранение в кеш для ключа ___ commmment84741160 ___ Только решение, которое сработало для меня. Благодаря! ___ ___ commmment30220287 вы имеете в виду, если мы устанавливаем ключ для каждого (фиксированного скачивания URL изображения), он не уволит загрузки события в сети? правильно ? и будет ли он использовать предыдущее кэширование? ___ commmment68810616 ___ Спасибо. Я не смотрел в Swift версию еще, но Свифт версии есть реализация класса SDWebImageDownloader кэшировать изображение с помощью пользовательского ключа вместо URL? ___ commmment32775655 ___ Посмотрите на него. спасибо ___ –  kalpesh jetani 28.11.2013 в 08:09
  • Прошло некоторое время с тех пор, как я посмотрел на это, но если вы планируете хранить изображение с определенным кеш-ключом, перед выполнением запроса на загрузку необходимо проверить [SDImageCache sharedImageCache] для изображения. Если у вас его нет, сохраните его с помощью своего конкретного ключа, чтобы он был в следующий раз. Это может измениться к настоящему времени, но вы должны использовать SDWebImageDownloader, а затем сохранить свой собственный ключ, если вы собираетесь это делать. –  Stakenborg 02.12.2013 в 15:50
13

В 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
источник
  • Спасибо. Я не смотрел в Swift версию еще, но Свифт версии есть реализация класса SDWebImageDownloader кэшировать изображение с помощью пользовательского ключа вместо URL? –  AgnosticDev 24.11.2016 в 21:40
  • Да, у быстрой версии есть класс для кэширования изображения с помощью ключа custome. Вы можете использовать ниже код SDImageCache.sharedImageCache (). StoreImage (image, forKey: "(file.attachmentFileName!) _ (File.fileId)") –  parth 25.11.2016 в 10:07
  • Удивительный! Кэшированное изображение с помощью настраиваемого ключа. –  yuchen 19.01.2017 в 04:23
  • Только решение, которое сработало для меня. Благодаря! –  Tom Calmon 19.02.2018 в 16:00
4

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

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

ответ дан slatvick 10.02.2014 в 14:42
источник
  • Посмотрите на него. спасибо –  AgnosticDev 10.02.2014 в 16:38
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
источник