web-dev-qa-db-ja.com

SDWebImage画像をダウンロードし、キーのキャッシュに保存します

こんにちは、プロジェクトで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];
            }

          }];  

見逃したものはありますか?私の割り当てツールでこれを行うと、大量のメモリが消費されるようです。

21
AgnosticDev

誰もこの質問に答えていないことに驚いていますが、同様の質問があり、これに遭遇しました。

質問に直接答えるために、はい、画像を2回キャッシュしています。

SDWebImageManagerの呼び出しをダウンロードすると、画像のURLのabsoluteStringに基づくキーで画像が自動的にキャッシュされます。独自のキーが必要な場合は、SDWebImageDownloaderのダウンロード呼び出しを使用できます。これは、私の知る限り、デフォルトではキャッシュされません。そこから、すでに実行中のsharedImageCacheを呼び出し、必要なキーでキャッシュできます。

それはさておき、SDWebImageは一般的にメモリではなくディスクにキャッシュするのが好きなので、どのような場合でも割り当てが積み重なるのを見るのは奇妙です。他の何かが同時に起こっているのでしょうか?

お役に立てれば、

-ブランドン

26
Stakenborg

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];     
                    }
                }]; 
17
parth

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 {. 

     }
})
5
reza_khalafi

Swift 4:

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

SDWebImageは、ディスクとメモリの両方に画像をキャッシュします。これを見ていきましょう。

  1. 新しいURLから画像をダウンロードします。
  2. メモリとディスクにキャッシュされます。
  3. 同じセッションで画像を呼び出すと、メモリから取得されます。
  4. アプリを再実行してからURLにアクセスすると、メモリがチェックされ、画像がそこにない場合、ディスクがチェックされ、そこから取得されます。そうでない場合は、ダウンロードします。
  5. 標準設定では、イメージは1週間ディスクに残ります。

そのため、キャッシングについて心配する必要はありません。 SDWebImageがそれをうまく処理します。

HTTPキャッシュヘッダーごとに設定が必要な場合は、キャッシュのカスタム実装とキャッシュからの画像の更新を行うことができます。

Githubページで詳細を確認できます here

4
Gautam Jain

SDWebImageの代わりにAPSmartStorage( https://github.com/Alterplay/APSmartStorage )を試してください。

APSmartStorageはネットワークからデータを取得し、スマートに設定可能な方法でディスクまたはメモリにデータを自動的にキャッシュします。あなたの仕事に十分なはずです。

4
slatvick

//カスタムイメージビューを作成し、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;

    }];
}
0
Slimshady

はい、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
}
0
AshvinGudaliya