如题
SDImageCache *imageCache= [[SDImageCache alloc] initWithNamespace:@"mynamespace"];
这一句是缓存目录对象
然后提供了一个方法
[imageCache queryDiskCacheForKey:url done:^(UIImage *image, SDImageCacheType cacheType) {}];
这是查找自己的缓存目录
这样确实能查找出图片 可是性能上有问题 这一句是查找的物理磁盘上的 并没有从内存中查找 性能上不是最好 那有没有什么方法能直接从内存中查找
我说一下我的业务 现在业务需要缓存两部分 一部分直接用sd的可以直接解决 另一部分是缓存后不能清除的 要自己管理 这时我就建了另一个缓存目录 可是我翻源码发现 只能从物理磁盘上取图片 这样性能不爽 那有没有什么方法能直接从内存中查找 真心求解答!!
大家讲道理2017-04-18 09:27:15
下面的方法,擴展性很低,其他開發者需要知道新的類別方法。
所以,建議繼承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