26

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

          }];  

見逃したことはありますか?私の割り当て機器でこれを行うと、大量のメモリが蓄積されているように見えます。

4

11 に答える 11

31

誰もこの質問に答えていないことに驚いていますが、同様の質問があり、これに出くわしたので、今後これを見ている人のために答えます(これまでに自分で整理したと仮定します)。

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

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

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

于 2013-04-22T19:04:30.290 に答える
5

スイフト 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 {. 

     }
})
于 2018-06-19T09:12:12.023 に答える
5

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

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

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

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

完全な詳細については、こちらの github ページを参照してください。

于 2015-08-24T10:21:04.830 に答える
4

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

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

于 2014-02-10T13:42:05.693 に答える
1

はい、使用してイメージをダウンロードし、手動で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
}
于 2018-11-14T11:39:30.207 に答える
0

スイフト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)

于 2020-06-29T10:52:34.390 に答える
0

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

    }];
}
于 2016-12-14T21:32:36.140 に答える
-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);
    }
}];
于 2015-08-17T09:04:37.547 に答える