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];
}
}];
Есть ли что-то, что я пропустил? Похоже, что это делается в моем инструменте распределения, накапливая много памяти.
Ответы
Ответ 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);
}
}];