首页 > 开发 > iOS > 正文

ios sdwebimage的独立缓存问题

2017-09-08 13:48:42  来源:网友分享

如题
SDImageCache *imageCache= [[SDImageCache alloc] initWithNamespace:@"mynamespace"];

这一句是缓存目录对象

然后提供了一个方法
[imageCache queryDiskCacheForKey:url done:^(UIImage *image, SDImageCacheType cacheType) {}];
这是查找自己的缓存目录

这样确实能查找出图片 可是性能上有问题 这一句是查找的物理磁盘上的 并没有从内存中查找 性能上不是最好 那有没有什么方法能直接从内存中查找

我说一下我的业务 现在业务需要缓存两部分 一部分直接用sd的可以直接解决 另一部分是缓存后不能清除的 要自己管理 这时我就建了另一个缓存目录 可是我翻源码发现 只能从物理磁盘上取图片 这样性能不爽 那有没有什么方法能直接从内存中查找 真心求解答!!

解决方案

下面的方法,扩展性很低,并且其他开发者需要知道新的类方法。
所以,建议继承SDImageCache ,并重写里面的部分方法。这样可以做到对无关的开发者透明处理。

可以参考下面的代码解决问题。

@interface SDImageCache (Sun)+ (UIImage *)imageFromMemoryCacheForKey_v2:(NSString *)key;+ (UIImage *)imageFromDiskCacheForKey_v2:(NSString *)key;@end@implementation SDImageCache (Sun)+ (instancetype)sunImageCaceh {    static SDImageCache *imageCache;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        imageCache = [[SDImageCache alloc] initWithNamespace:@"posters"];        imageCache.maxCacheSize = 1024*30*1024;    });    return imageCache;}+ (UIImage *)imageFromMemoryCacheForKey_v2:(NSString *)key {    UIImage *memoryImage = [[SDImageCache sunImageCaceh] imageFromMemoryCacheForKey:key];    if(!memoryImage) {        memoryImage = [[SDImageCache sharedImageCache] imageFromMemoryCacheForKey:key];    }    return memoryImage;}+ (UIImage *)imageFromDiskCacheForKey_v2:(NSString *)key {    UIImage *diskImage;    diskImage = [[SDImageCache sunImageCaceh] imageFromDiskCacheForKey:key];    if(!diskImage) {        diskImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key];    }    return diskImage;}@end@interface sun : NSObject@end@implementation sun- (void)loadImage {    NSString *imagePath = [HUWebImage cacheImagePath:@"posters"];    NSString *cachePathForKey = [HUWebImage cachePathForKey:url inPath:imagePath];    UIImage *image;    image = [SDImageCache imageFromMemoryCacheForKey_v2:cachePathForKey];    if(!image) {        image = [SDImageCache imageFromDiskCacheForKey_v2:cachePathForKey];    }    if(!image) {        NSURL *imageURL = [NSURL URLWithString:i];        // 网络下载        [SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL options:SDWebImageLowPriority | SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {} completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {             if(image && finished && data) {                 // 根据需求存入不同的磁盘                 [imageCache storeImage:image forKey:url toDisk:true];                 [[SDImageCache sharedImageCache] storeImage:image forKey:url toDisk:true];             }         }];    }}@end