26

您好我在项目中使用 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];
            }

          }];  

有什么我错过的吗?看起来在我的分配工具中这样做会占用大量内存。

4

11 回答 11

31

我很惊讶没有人回答这个问题,但是我有一个类似的问题并且遇到了这个问题,所以我会为以后看到这个问题的人回答这个问题(假设你现在已经自己解决了这个问题)。

要直接回答您的问题,是的,您将图像缓存两次。

下载对 SDWebImageManager 的调用会根据图像 url 的 absoluteString 自动缓存带有键的图像。如果您想要自己的密钥,可以使用 SDWebImageDownloader 上的下载调用,据我所知,默认情况下不会缓存。从那里您可以调用 sharedImageCache ,就像您已经在做的那样,并使用您想要的任何键进行缓存。

除此之外,奇怪的是,您在任何情况下都看到分配堆积如山,因为 SDWebImage 通常喜欢缓存到磁盘而不是内存。也许同时发生了其他事情?

于 2013-04-22T19:04:30.290 回答
24

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];     
                    }
                }]; 
于 2016-11-24T11:10:44.040 回答
13

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
    }
)
于 2019-10-10T16:12:43.593 回答
8

斯威夫特 4:

SDWebImageManager.shared().loadImage(
        with: URL(string: imageUrl),
        options: .highPriority,
        progress: nil) { (image, data, error, cacheType, isFinished, imageUrl) in
          print(isFinished)
      }
于 2018-11-21T12:09:00.950 回答
5

SDWebImage 将图像缓存到磁盘和内存中。让我们来看看这个:

  1. 您从新网址下载图像。
  2. 它被缓存到内存和磁盘。
  3. 如果您在同一会话中调用该图像,则会从内存中检索该图像。
  4. 假设您重新运行应用程序,然后访问 url,它将检查内存,图像不在那里,然后它会检查磁盘,并从那里获取它。如果没有,它将下载它。
  5. 按照标准设置,图像会在磁盘中保留一周。

因此,您无需担心缓存。SDWebImage 处理得非常好。

如果您还希望根据 HTTP 缓存标头进行设置,您可以对缓存进行自定义实现以及从缓存中刷新图像。

您可以在他们的 github 页面上找到完整的详细信息

于 2015-08-24T10:21:04.830 回答
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 回答
4

尝试 APSmartStorage ( https://github.com/Alterplay/APSmartStorage ) 而不是 SDWebImage。

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

//创建一个自定义的IMAGEVIEW并通过数组传递图像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 回答
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 回答
-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 回答