簡體   English   中英

SDWebImage 下載圖像並存儲到緩存以獲取密鑰

[英]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 將圖像緩存到磁盤和內存中。 讓我們來看看這個:

  1. 您從新網址下載圖像。
  2. 它被緩存到內存和磁盤。
  3. 如果您在同一會話中調用圖像,則會從內存中檢索它。
  4. 假設您重新運行應用程序,然后訪問 url,它將檢查內存,圖像將不在那里,然后它會檢查磁盤,並從那里獲取它。 如果沒有,它會下載它。
  5. 圖像按照標准設置在磁盤中保留一周。

因此,您無需擔心緩存。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM