こんにちは、プロジェクトでSDWebImageフレームワークを使用していて、画像をダウンロードしてキャッシュしたいのですが、コードがキャッシュに画像を2回保存していると思いますか?キーで画像を一度だけキャッシュに保存する方法はありますか?これが私のコードです。
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];
}
}];
見逃したものはありますか?私の割り当てツールでこれを行うと、大量のメモリが消費されるようです。
誰もこの質問に答えていないことに驚いていますが、同様の質問があり、これに遭遇しました。
質問に直接答えるために、はい、画像を2回キャッシュしています。
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
}
}
})
Swiftバージョン:
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 4.でこれを試してください。
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 {.
}
})
Swift 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ページで詳細を確認できます here 。
SDWebImageの代わりにAPSmartStorage( https://github.com/Alterplay/APSmartStorage )を試してください。
APSmartStorageはネットワークからデータを取得し、スマートに設定可能な方法でディスクまたはメモリにデータを自動的にキャッシュします。あなたの仕事に十分なはずです。
//カスタムイメージビューを作成し、ARRAY(INDEXPATH.ROW)でイメージURLを渡す
(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;
}];
}
はい、SDWebImage
を使用してイメージをダウンロードし、ローカルメモリに保存できます手動で。
ダウンロードしたイメージローカルメモリに保存 using 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
}