如题
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