This repository has been archived by the owner on May 8, 2020. It is now read-only.
/
_DCTDiskImageCache.m
175 lines (153 loc) · 6.65 KB
/
_DCTDiskImageCache.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
//
// _DCTDiskImageCache.m
// DCTImageCache
//
// Created by Daniel Tull on 03.07.2012.
// Copyright (c) 2012 Daniel Tull. All rights reserved.
//
#import "_DCTDiskImageCache.h"
#import "_DCTImageCacheItem.h"
#import <CoreData/CoreData.h>
@implementation _DCTDiskImageCache {
NSURL *_storeURL;
NSManagedObjectContext *_managedObjectContext;
}
+ (NSBundle *)bundle {
static NSBundle *bundle;
static dispatch_once_t bundleToken;
dispatch_once(&bundleToken, ^{
NSDirectoryEnumerator *enumerator = [[NSFileManager new] enumeratorAtURL:[[NSBundle mainBundle] bundleURL]
includingPropertiesForKeys:nil
options:NSDirectoryEnumerationSkipsHiddenFiles
errorHandler:NULL];
for (NSURL *URL in enumerator)
if ([[URL lastPathComponent] isEqualToString:@"DCTImageCache.bundle"])
bundle = [NSBundle bundleWithURL:URL];
});
return bundle;
}
- (id)initWithPath:(NSString *)path {
if (!(self = [super init])) return nil;
_storeURL = [[[NSURL alloc] initFileURLWithPath:path] URLByAppendingPathComponent:@"store"];
[self _createStack];
return self;
}
- (void)_createStack {
NSURL *modelURL = [[[self class] bundle] URLForResource:@"DCTImageCache" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[[NSFileManager defaultManager] createDirectoryAtURL:[_storeURL URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:NULL];
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:_storeURL options:nil error:NULL]) {
[[NSFileManager defaultManager] removeItemAtURL:_storeURL error:NULL];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:_storeURL options:nil error:NULL];
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_managedObjectContext.persistentStoreCoordinator = coordinator;
}
- (void)removeAllImages {
[[NSFileManager defaultManager] removeItemAtURL:_storeURL error:NULL];
[self _createStack];
}
- (void)removeImageForKey:(NSString *)key size:(CGSize)size {
[_managedObjectContext performBlock:^{
NSFetchRequest *fetchRequest = [self _fetchRequestForKey:key size:size];
NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:NULL];
for (_DCTImageCacheItem *item in items)
[_managedObjectContext deleteObject:item];
[_managedObjectContext save:NULL];
[_managedObjectContext performBlock:^{
[_managedObjectContext save:NULL];
}];
}];
}
- (void)removeAllImagesForKey:(NSString *)key {
[_managedObjectContext performBlock:^{
NSFetchRequest *fetchRequest = [self _fetchRequestForKey:key];
NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:NULL];
for (_DCTImageCacheItem *item in items)
[_managedObjectContext deleteObject:item];
[_managedObjectContext save:NULL];
[_managedObjectContext performBlock:^{
[_managedObjectContext save:NULL];
}];
}];
}
- (void)setImage:(UIImage *)image forKey:(NSString *)key size:(CGSize)size {
[_managedObjectContext performBlock:^{
_DCTImageCacheItem *item = [_DCTImageCacheItem insertInManagedObjectContext:_managedObjectContext];
item.key = key;
item.sizeString = NSStringFromCGSize(size);
item.imageData = UIImagePNGRepresentation(image);
item.date = [NSDate new];
[_managedObjectContext save:NULL];
[_managedObjectContext performBlock:^{
[_managedObjectContext save:NULL];
}];
}];
}
- (UIImage *)imageForKey:(NSString *)key size:(CGSize)size {
__block UIImage *image;
[_managedObjectContext performBlockAndWait:^{
NSFetchRequest *fetchRequest = [self _fetchRequestForKey:key size:size];
NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:NULL];
_DCTImageCacheItem *item = [items lastObject];
image = [UIImage imageWithData:item.imageData];
}];
return image;
}
- (BOOL)hasImageForKey:(NSString *)key size:(CGSize)size {
__block BOOL hasImage = NO;
[_managedObjectContext performBlockAndWait:^{
NSFetchRequest *fetchRequest = [self _fetchRequestForKey:key size:size];
NSUInteger count = [_managedObjectContext countForFetchRequest:fetchRequest error:NULL];
hasImage = count > 0;
}];
return hasImage;
}
- (void)fetchImageForKey:(NSString *)key size:(CGSize)size handler:(void (^)(UIImage *))handler {
[_managedObjectContext performBlock:^{
NSFetchRequest *fetchRequest = [self _fetchRequestForKey:key size:size];
NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:NULL];
_DCTImageCacheItem *item = [items lastObject];
UIImage *image = [UIImage imageWithData:item.imageData];
handler(image);
}];
}
- (NSFetchRequest *)_fetchRequestForKey:(NSString *)key {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:[_DCTImageCacheItem entityName]];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"%K == %@", _DCTImageCacheItemAttributes.key, key];
return fetchRequest;
}
- (NSFetchRequest *)_fetchRequestForKey:(NSString *)key size:(CGSize)size {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:[_DCTImageCacheItem entityName]];
NSPredicate *keyPredicate = [NSPredicate predicateWithFormat:@"%K == %@", _DCTImageCacheItemAttributes.key, key];
NSPredicate *sizePredicate = [NSPredicate predicateWithFormat:@"%K == %@", _DCTImageCacheItemAttributes.sizeString, NSStringFromCGSize(size)];
fetchRequest.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[keyPredicate, sizePredicate]];
return fetchRequest;
}
/*
- (void)fetchAttributesForImageWithKey:(NSString *)key size:(CGSize)size handler:(void (^)(NSDictionary *))handler {
[self _performBlock:^{
NSString *path = [self _pathForKey:key size:size];
NSDictionary *dictionary = [_fileManager attributesOfItemAtPath:path error:nil];
handler(dictionary);
}];
}
- (void)enumerateKeysUsingBlock:(void (^)(NSString *key, BOOL *stop))block {
[self _performBlock:^{
NSArray *filenames = [[_fileManager contentsOfDirectoryAtPath:_path error:nil] copy];
[filenames enumerateObjectsUsingBlock:^(NSString *filename, NSUInteger i, BOOL *stop) {
NSString *key = [_hashStore keyForHash:filename];
block(key, stop);
}];
}];
}
- (void)enumerateSizesForKey:(NSString *)key usingBlock:(void (^)(CGSize size, BOOL *stop))block {
[self _performBlock:^{
NSArray *filenames = [[_fileManager contentsOfDirectoryAtPath:[self _pathForKey:key] error:nil] copy];
[filenames enumerateObjectsUsingBlock:^(NSString *filename, NSUInteger i, BOOL *stop) {
block(CGSizeFromString(filename), stop);
}];
}];
}*/
@end