From fbf14d2e163eb9a8c27bdc8983ae51a2514db977 Mon Sep 17 00:00:00 2001 From: Nebil Kriedi Date: Thu, 21 Feb 2013 01:07:44 +0000 Subject: [PATCH] Prefetching file properties in the disk cleaning enumerator --- SDWebImage/SDImageCache.m | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index b558e35..8a5bc61 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -256,14 +256,29 @@ static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week dispatch_async(self.ioQueue, ^ { NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.maxCacheAge]; - NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:self.diskCachePath]; - for (NSString *fileName in fileEnumerator) + // convert NSString path to NSURL path + NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; + // build an enumerator by also prefetching file properties we want to read + NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtURL:diskCacheURL + includingPropertiesForKeys:@[ NSURLIsDirectoryKey, NSURLContentModificationDateKey ] + options:NSDirectoryEnumerationSkipsHiddenFiles + errorHandler:NULL]; + for (NSURL *fileURL in fileEnumerator) { - NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName]; - NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; - if ([[[attrs fileModificationDate] laterDate:expirationDate] isEqualToDate:expirationDate]) + // skip folder + NSNumber *isDirectory; + [fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:NULL]; + if ([isDirectory boolValue]) { - [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil]; + continue; + } + + // compare file date with the max age + NSDate *fileModificationDate; + [fileURL getResourceValue:&fileModificationDate forKey:NSURLContentModificationDateKey error:NULL]; + if ([[fileModificationDate laterDate:expirationDate] isEqualToDate:expirationDate]) + { + [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil]; } } });