Подтвердить что ты не робот

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

Здравствуйте, я использую инфраструктуру 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];
            }

          }];  

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

4b9b3361

Ответ 1

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

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

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

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

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

-Brandon

Ответ 2

В 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];     
                    }
                }]; 

Ответ 3

Попробуйте это для Swift 4.0.

let url = URL(string: imageUrl!)

SDWebImageManager.shared().imageDownloader?.downloadImage(with: url, options: .continueInBackground, progress: nil, completed: {(image:UIImage?, data:Data?, error:Error?, finished:Bool) in
     if image != nil {. 

     }
})

Ответ 4

Swift 4:

SDWebImageManager.shared().loadImage(
        with: URL(string: imageUrl),
        options: .highPriority,
        progress: nil) { (image, data, error, cacheType, isFinished, imageUrl) in
          print(isFinished)
      }

Ответ 5

Попробуйте APSmartStorage (https://github.com/Alterplay/APSmartStorage) вместо SDWebImage.

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

Ответ 6

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

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

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

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

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

Ответ 7

//СОЗДАТЬ ОБРАТНЫЙ ОБРАЗЕЦ И ПРОХОДИТЬ 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;

    }];
}

Ответ 8

Да можно загрузить изображение с помощью SDWebImage и сохранить в локальной памяти вручную.

Загруженное изображение сохраните в локальной памяти, используя SDWebImage

func saveImage(url: URL, toCache: UIImage?, complation: @escaping SDWebImageNoParamsBlock) {
    guard let toCache = toCache else { return }

    let manager = SDWebImageManager.shared()
    if let key = manager.cacheKey(for: url) {
        manager.imageCache?.store(toCache, forKey: key, completion: complation)
    }
}

Загрузить изображение из памяти, используя URL-адрес изображения

static func imageFromMemory(for url: String) -> UIImage? {
    if let encoded = url.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed),
        let url = URL(string: encoded) {
        let manager = SDWebImageManager.shared()
        if let key: String = manager.cacheKey(for: url),
            let image = manager.imageCache?.imageFromMemoryCache(forKey: key) {
            return image
        }
    }
    return nil
}

Ответ 9

SWIFT 5 & Последний SDWebImage 5.2.3

SDWebImageManager.shared.loadImage(
    with: album.artUrlFor(imageShape: .square),
    options: .continueInBackground, // or .highPriority
    progress: nil,
    completed: { [weak self] (image, data, error, cacheType, finished, url) in
        guard let sself = self else { return }

        if let err = error {
            // Do something with the error
            return
        }

        guard let img = image else {
            // No image handle this error
            return
        }

        // Do something with image
    }
)

Ответ 10

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