[英]SDWebImage Download image and store to cache for key
你好我在一個項目中使用 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];
}
}];
有什么我錯過的嗎? 看起來在我的分配工具中這樣做會占用大量內存。
我很驚訝沒有人回答這個問題,但我有一個類似的問題並遇到了這個問題,所以我會為以后看到這個問題的人回答(假設你現在已經自己解決了這個問題)。
要直接回答您的問題,是的,您將圖像緩存兩次。
下載調用 SDWebImageManager 會根據圖像 url 的 absoluteString 自動緩存帶有鍵的圖像。 如果你想要你自己的密鑰,你可以使用 SDWebImageDownloader 上的下載調用,據我所知,默認情況下它不會緩存。 從那里你可以像你已經在做的那樣調用 sharedImageCache 並使用你想要的任何鍵進行緩存。
除此之外,很奇怪你在任何情況下都看到分配堆積如山,因為 SDWebImage 喜歡緩存到磁盤而不是內存。 也許同時還有其他事情正在發生?
希望這可以幫助,
-布蘭登
在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
}
}
})
斯威夫特 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];
}
}];
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
}
)
斯威夫特 4:
SDWebImageManager.shared().loadImage(
with: URL(string: imageUrl),
options: .highPriority,
progress: nil) { (image, data, error, cacheType, isFinished, imageUrl) in
print(isFinished)
}
SDWebImage 將圖像緩存到磁盤和內存中。 讓我們來看看這個:
因此,您無需擔心緩存。 SDWebImage 處理得非常好。
如果您還需要根據 HTTP 緩存標頭進行設置,您可以為緩存進行自定義實現以及從緩存中刷新圖像。
您可以在此處的 github 頁面上找到完整的詳細信息。
在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 {.
}
})
嘗試 APSmartStorage ( https://github.com/Alterplay/APSmartStorage ) 而不是 SDWebImage。
APSmartStorage 從網絡獲取數據,並以智能可配置的方式自動將數據緩存在磁盤或內存中。 應該足以勝任您的任務。
是的,可以使用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
}
//創建自定義圖像視圖並通過數組傳遞圖像 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;
}];
}
斯威夫特 5.1
import UIKit
import SDWebImage
extension UIImageView{
func downloadImage(url:String){
//remove space if a url contains.
let stringWithoutWhitespace = url.replacingOccurrences(of: " ", with: "%20", options: .regularExpression)
self.sd_imageIndicator = SDWebImageActivityIndicator.gray
self.sd_setImage(with: URL(string: stringWithoutWhitespace), placeholderImage: UIImage())
}
}
如何使用
let myUrl = "https://www.example.com"
myImageView.downloadImage(url: myUrl)
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);
}
}];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.