123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- //
- // YYCache.m
- // YYKit <https://github.com/ibireme/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<NSCoding>)objectForKey:(NSString *)key {
- id<NSCoding> 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<NSCoding> object))block {
- if (!block) return;
- id<NSCoding> 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<NSCoding> object) {
- if (object && ![_memoryCache objectForKey:key]) {
- [_memoryCache setObject:object forKey:key];
- }
- block(key, object);
- }];
- }
- }
- - (void)setObject:(id<NSCoding>)object forKey:(NSString *)key {
- [_memoryCache setObject:object forKey:key];
- [_diskCache setObject:object forKey:key];
- }
- - (void)setObject:(id<NSCoding>)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
|