搜索

首页  >  问答  >  正文

objective-c - ios sdwebimage的独立缓存问题

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

这一句是缓存目录对象

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

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

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

高洛峰高洛峰2889 天前382

全部回复(1)我来回复

  • 大家讲道理

    大家讲道理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
    

    回复
    0
  • 取消回复