// // YYCache.m // YYKit // // Created by ibireme on 15/2/13. // Copyright (c) 2015 ibireme. // // This source code is licensed under the MIT-style license found in the // LICENSE file in the root directory of this source tree. // #import "YYCache.h" #import "YYMemoryCache.h" #import "YYDiskCache.h" @implementation YYCache - (instancetype) init { NSLog(@"Use \"initWithName\" or \"initWithPath\" to create YYCache instance."); return [self initWithPath:@""]; } - (instancetype)initWithName:(NSString *)name { if (name.length == 0) return nil; NSString *cacheFolder = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; NSString *path = [cacheFolder stringByAppendingPathComponent:name]; return [self initWithPath:path]; } - (instancetype)initWithPath:(NSString *)path { if (path.length == 0) return nil; YYDiskCache *diskCache = [[YYDiskCache alloc] initWithPath:path]; if (!diskCache) return nil; NSString *name = [path lastPathComponent]; YYMemoryCache *memoryCache = [YYMemoryCache new]; memoryCache.name = name; self = [super init]; _name = name; _diskCache = diskCache; _memoryCache = memoryCache; return self; } + (instancetype)cacheWithName:(NSString *)name { return [[self alloc] initWithName:name]; } + (instancetype)cacheWithPath:(NSString *)path { return [[self alloc] initWithPath:path]; } - (BOOL)containsObjectForKey:(NSString *)key { return [_memoryCache containsObjectForKey:key] || [_diskCache containsObjectForKey:key]; } - (void)containsObjectForKey:(NSString *)key withBlock:(void (^)(NSString *key, BOOL contains))block { if (!block) return; if ([_memoryCache containsObjectForKey:key]) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ block(key, YES); }); } else { [_diskCache containsObjectForKey:key withBlock:block]; } } - (id)objectForKey:(NSString *)key { id object = [_memoryCache objectForKey:key]; if (!object) { object = [_diskCache objectForKey:key]; if (object) { [_memoryCache setObject:object forKey:key]; } } return object; } - (void)objectForKey:(NSString *)key withBlock:(void (^)(NSString *key, id object))block { if (!block) return; id object = [_memoryCache objectForKey:key]; if (object) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ block(key, object); }); } else { [_diskCache objectForKey:key withBlock:^(NSString *key, id object) { if (object && ![_memoryCache objectForKey:key]) { [_memoryCache setObject:object forKey:key]; } block(key, object); }]; } } - (void)setObject:(id)object forKey:(NSString *)key { [_memoryCache setObject:object forKey:key]; [_diskCache setObject:object forKey:key]; } - (void)setObject:(id)object forKey:(NSString *)key withBlock:(void (^)(void))block { [_memoryCache setObject:object forKey:key]; [_diskCache setObject:object forKey:key withBlock:block]; } - (void)removeObjectForKey:(NSString *)key { [_memoryCache removeObjectForKey:key]; [_diskCache removeObjectForKey:key]; } - (void)removeObjectForKey:(NSString *)key withBlock:(void (^)(NSString *key))block { [_memoryCache removeObjectForKey:key]; [_diskCache removeObjectForKey:key withBlock:block]; } - (void)removeAllObjects { [_memoryCache removeAllObjects]; [_diskCache removeAllObjects]; } - (void)removeAllObjectsWithBlock:(void(^)(void))block { [_memoryCache removeAllObjects]; [_diskCache removeAllObjectsWithBlock:block]; } - (void)removeAllObjectsWithProgressBlock:(void(^)(int removedCount, int totalCount))progress endBlock:(void(^)(BOOL error))end { [_memoryCache removeAllObjects]; [_diskCache removeAllObjectsWithProgressBlock:progress endBlock:end]; } - (NSString *)description { if (_name) return [[NSString alloc] initWithFormat:@"<%@: %p> (%@)", self.class, self, _name]; else return [[NSString alloc] initWithFormat:@"<%@: %p>", self.class, self]; } @end