From 547345c7f5372d29172630c4df8d743491fe45ba Mon Sep 17 00:00:00 2001 From: Don Date: Thu, 12 Sep 2013 11:58:43 -0700 Subject: [PATCH 1/2] Added and exposed some methods that allow to check if an image exists on disk without taking it off disk and decompressing it first. Makes for a nice performance boost when checking if many files exist in the disk cache already --- SDWebImage/SDImageCache.h | 5 +++++ SDWebImage/SDImageCache.m | 18 +++++++++++++++++- SDWebImage/SDWebImageManager.h | 5 +++++ SDWebImage/SDWebImageManager.m | 5 +++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 133af9d..4a571c1 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -159,4 +159,9 @@ typedef enum SDImageCacheType SDImageCacheType; */ - (void)calculateSizeWithCompletionBlock:(void (^)(NSUInteger fileCount, unsigned long long totalSize))completionBlock; +/** + * Check if image exists in cache already + */ +- (BOOL)diskImageExistsWithKey:(NSString *)key; + @end diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 0b86507..16b1e6c 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -25,7 +25,9 @@ static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week @end -@implementation SDImageCache +@implementation SDImageCache { + NSFileManager *_fileManager; +} + (SDImageCache *)sharedImageCache { @@ -60,6 +62,10 @@ static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace]; + dispatch_sync(_ioQueue, ^{ + _fileManager = NSFileManager.new; + }); + #if TARGET_OS_IPHONE // Subscribe to app events [[NSNotificationCenter defaultCenter] addObserver:self @@ -184,6 +190,16 @@ static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week [self storeImage:image imageData:nil forKey:key toDisk:toDisk]; } +- (BOOL)diskImageExistsWithKey:(NSString *)key { + + __block BOOL exists = NO; + dispatch_sync(_ioQueue, ^{ + exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; + }); + + return exists; +} + - (UIImage *)imageFromMemoryCacheForKey:(NSString *)key { return [self.memCache objectForKey:key]; diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index da8abce..4528dcf 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -171,4 +171,9 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; */ - (BOOL)isRunning; +/** + * Check if image has already been cached + */ +- (BOOL)diskImageExistsForURL:(NSURL *)url; + @end diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 8940d65..5c89fdf 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -66,6 +66,11 @@ } } +- (BOOL)diskImageExistsForURL:(NSURL *)url { + NSString *key = [self cacheKeyForURL:url]; + return [self.imageCache diskImageExistsWithKey:key]; +} + - (id)downloadWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedWithFinishedBlock)completedBlock { // Invoking this method without a completedBlock is pointless From 8a2ae7e5475640bbf36ae8d0944eb621811619f2 Mon Sep 17 00:00:00 2001 From: Don Date: Thu, 12 Sep 2013 13:45:11 -0700 Subject: [PATCH 2/2] Fixed styling to match rs/SDWebImage repo --- SDWebImage/SDImageCache.m | 10 ++++++---- SDWebImage/SDWebImageManager.m | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 16b1e6c..f520fe5 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -62,7 +62,8 @@ static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace]; - dispatch_sync(_ioQueue, ^{ + dispatch_sync(_ioQueue, ^ + { _fileManager = NSFileManager.new; }); @@ -190,10 +191,11 @@ static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week [self storeImage:image imageData:nil forKey:key toDisk:toDisk]; } -- (BOOL)diskImageExistsWithKey:(NSString *)key { - +- (BOOL)diskImageExistsWithKey:(NSString *)key +{ __block BOOL exists = NO; - dispatch_sync(_ioQueue, ^{ + dispatch_sync(_ioQueue, ^ + { exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; }); diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 5c89fdf..a3ecdec 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -66,7 +66,8 @@ } } -- (BOOL)diskImageExistsForURL:(NSURL *)url { +- (BOOL)diskImageExistsForURL:(NSURL *)url +{ NSString *key = [self cacheKeyForURL:url]; return [self.imageCache diskImageExistsWithKey:key]; }