2013-02-15 9 views
17

こんにちは私はプロジェクトでSDWebImageフレームワークを使用しています。画像をダウンロードしてキャッシュしたいのですが、自分のコードが画像をキャッシュに2回保存していると思いますか?キーによって画像をキャッシュに一度だけ保存する方法はありますか?ここに私のコードです。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]; 
      } 

      }]; 

紛失したことがありますか?私の割り当ての中でこれをやっているように見えますが、多くの記憶が詰まっています。

答えて

23

私はこの質問に答えた人は誰も驚いていますが、私も同様の質問をしてこれを見てきましたので、これを見る人々のために答えていきます(これを今までに自分で分けたと仮定します) 。

質問に直接答えるには、はい、イメージを2回キャッシュしています。

SDWebImageManagerへのダウンロードを呼び出すと、画像のURLのabsoluteStringに基づいてキー付き画像が自動的にキャッシュされます。独自のキーが必要な場合は、SDWebImageDownloaderのダウンロードコールを使用することができます。これは、デフォルトではキャッシュしないことがわかります。そこから、すでに行っているようにsharedImageCacheを呼び出すことができ、必要なキーでキャッシュすることができます。

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

希望、

-Brandon

+0

することにより、画像のURLを渡しますネットワーク上で?右 ? これは以前のキャッシングを使用しますか? –

+0

私はこれを見てからしばらくしていましたが、特定のキャッシュキーを使用してイメージを保存する予定がある場合は、ダウンロードリクエストを行う前にイメージの[SDImageCache sharedImageCache]を確認する必要があります。あなたがそれを持っていないなら、あなたの特定の鍵でそれを保管してください。これは今変更されている可能性がありますが、 'SDWebImageDownloader'を使用して、このようにする場合は独自のキーで保存してください。 – Stakenborg

4

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

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

+0

それを調べます。ありがとうございます。 – AgnosticDev

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

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

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

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

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

完全な詳細は、githubページhereで確認できます。

12

でスウィフト画像をダウンロードするために以下のコードを使用してキャッシュに格納する。

//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];  
        } 
       }]; 
+0

ありがとうございました。 Swiftのバージョンはまだ見ていませんが、SwiftのバージョンにはSDWebImageDownloaderクラスの実装があり、URLの代わりにカスタムキーを使ってイメージをキャッシュしますか? – AgnosticDev

+0

はいswift版には、あなたのイメージをカスタネットキーでキャッシュするクラスがあります。 SDImageCache.sharedImageCache()。storeImage(image、forKey: "\(file.attachmentFileName!)_ \(file.fileId)") – parth

+0

Awesome!最終的にカスタムキーでキャッシュされたイメージ。 – yuchen

0

//あなたは私たちがそれぞれの(固定のダウンロード画像のURL)のためのキーを設定した場合、それはイベントのダウンロードを発射するつもりはありません意味ですか、カスタマーのImageViewのを作成して、ARRAY(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; 

    }]; 
} 
関連する問題