-
Notifications
You must be signed in to change notification settings - Fork 0
/
CSImageCache.m
202 lines (173 loc) · 5.89 KB
/
CSImageCache.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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
//
// ImageCache.m
// ImageCacheTest
//
// Created by Adrian on 1/28/09.
// Copyright 2009 Adrian Kosmaczewski. All rights reserved.
//
#import "CSImageCache.h"
#import "GTMObjectSingleton.h"
@interface CSImageCache(Private)
- (void)addImageToMemoryCache:(UIImage *)image withKey:(NSString *)key;
- (NSString *)getCacheDirectoryName;
- (NSString *)getFileNameForKey:(NSString *)key;
- (BOOL)imageExistsInMemory:(NSString *)key;
- (BOOL)imageExistsInDisk:(NSString *)key;
@end
@implementation CSImageCache
@synthesize _keyArray;
@synthesize _memoryCache;
@synthesize _fileManager;
@synthesize _domain;
-(id)initWithDomain:(id<CSImageCacheDomain>) domain {
if (self = [super init]){
self._domain=domain;
self._keyArray = [[NSMutableArray alloc] initWithCapacity:[domain memoryCacheSize]];
self._memoryCache = [[NSMutableDictionary alloc] initWithCapacity:[domain memoryCacheSize]];
self._fileManager = [NSFileManager defaultManager];
/*
NSString *cacheDirectoryName = [domain diskFolder];//[self getCacheDirectoryName];
BOOL isDirectory = NO;
BOOL folderExists = [_fileManager fileExistsAtPath:cacheDirectoryName isDirectory:&isDirectory] && isDirectory;
if (!folderExists) {
NSError *error = nil;
[_fileManager createDirectoryAtPath:cacheDirectoryName withIntermediateDirectories:YES attributes:nil error:&error];
[error release];
}
*/
}
return self;
}
- (void)dealloc
{
[_keyArray release];
[_memoryCache release];
_keyArray = nil;
_memoryCache = nil;
// _fileManager = nil;
[super dealloc];
}
#pragma mark -
#pragma mark Public methods
- (UIImage *)imageForKey:(NSString *)key
{
UIImage *image = [_memoryCache objectForKey:key];
if (image == nil && [_domain imageExists:key])
{
// NSString *fileName =
NSData *data = [_domain getImageContents:key];//[NSData dataWithContentsOfFile:fileName];
image = [[[UIImage alloc] initWithData:data] autorelease];
[self addImageToMemoryCache:image withKey:key];
}
return image;
}
- (BOOL)hasImageWithKey:(NSString *)key {
BOOL exists = [self imageExistsInMemory:key];
if (!exists) {
exists = [_domain imageExists:key];
}
return exists;
}
- (void)removeImageWithKey:(NSString *)key {
if ([self imageExistsInMemory:key])
{
NSUInteger index = [_keyArray indexOfObject:key];
[_keyArray removeObjectAtIndex:index];
[_memoryCache removeObjectForKey:key];
}
//[_domain removeImageFile:key];
// if ([_domain imageExists:key])
// {
// NSError *error = nil;
// NSString *fileName = [self getFileNameForKey:key];
// [_fileManager removeItemAtPath:fileName error:&error];
// [error release];
// }
}
- (void)removeAllImages {
[_memoryCache removeAllObjects];
[_domain removeAllImages];
}
- (void)removeAllImagesInMemory {
[_memoryCache removeAllObjects];
}
/*
- (void)removeOldImages{
NSString *cacheDirectoryName = [self getCacheDirectoryName];
NSArray *items = [_fileManager directoryContentsAtPath:cacheDirectoryName];
for (NSString *item in items)
{
NSString *path = [cacheDirectoryName stringByAppendingPathComponent:item];
NSDictionary *attributes = [_fileManager attributesOfItemAtPath:path error:nil];
NSDate *creationDate = [attributes valueForKey:NSFileCreationDate];
if (abs([creationDate timeIntervalSinceNow]) > [_domain lifetime]) {
NSError *error = nil;
[_fileManager removeItemAtPath:path error:&error];
DebugLog(@"removed: [%@] error:[%@]",path,error);
}
}
}
*/
- (BOOL)imageExistsInMemory:(NSString *)key
{
return ([_memoryCache objectForKey:key] != nil);
}
- (BOOL)imageExistsInDomain:(NSString *)key {
// NSString *fileName = [self getFileNameForKey:key];
return [_domain imageExists:key];//[_fileManager fileExistsAtPath:fileName];
}
- (NSUInteger)countImagesInMemory {
return [_memoryCache count];
}
/*
- (NSUInteger)countImagesInDomain
{
// NSString *cacheDirectoryName = [self getCacheDirectoryName];
// NSArray *items = [_fileManager directoryContentsAtPath:cacheDirectoryName];
return [_domain imagesCount];
}
*/
- (void)addImage:(UIImage *)image withKey:(NSString *)key keepInMemory:(BOOL)keepInMemory {
if (image != nil && key != nil){
if(keepInMemory) {
[self addImageToMemoryCache:image withKey:key];
}
[_domain addImage:image withKey:key];
}
}
- (void)addImageToMemoryCache:(UIImage *)image withKey:(NSString *)key {
// Add the object to the memory cache for faster retrieval next time
[_memoryCache setObject:image forKey:key];
// Add the key at the beginning of the _keyArray
[_keyArray insertObject:key atIndex:0];
// Remove the first object added to the memory cache
if ([_keyArray count] > [_domain memoryCacheSize])
{
// This is the "raison d'etre" de _keyArray:
// we use it to keep track of the last object
// in it (that is, the first we've inserted),
// so that the total size of objects in memory
// is never higher than MEMORY_CACHE_SIZE.
NSString *lastObjectKey = [_keyArray lastObject];
[_memoryCache removeObjectForKey:lastObjectKey];
[_keyArray removeLastObject];
}
}
/*
- (NSString *)getCacheDirectoryName {
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *documentsDirectory = [paths objectAtIndex:0];
// NSString *cacheDirectoryName = [documentsDirectory stringByAppendingPathComponent:CACHE_FOLDER_NAME];
// return cacheDirectoryName;
return [_domain diskFolder];
}
*/
/*
- (NSString *)getFileNameForKey:(NSString *)key
{
NSString *cacheDirectoryName = [self getCacheDirectoryName];
NSString *fileName = [cacheDirectoryName stringByAppendingPathComponent:key];
return fileName;
}
*/
@end