Skip to content

Commit 1af09be

Browse files
author
Brendt
committed
Added failureBlock to allow proper handing of errors situations
1 parent a09d871 commit 1af09be

4 files changed

Lines changed: 67 additions & 28 deletions

File tree

JMImageCache.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222

2323
+ (JMImageCache *) sharedCache;
2424

25-
- (void) imageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion;
26-
- (void) imageForURL:(NSURL *)url completionBlock:(void (^)(UIImage *image))completion;
25+
- (void) imageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure;
26+
- (void) imageForURL:(NSURL *)url completionBlock:(void (^)(UIImage *image))completion failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure;
2727

2828
- (UIImage *) cachedImageForKey:(NSString *)key;
2929
- (UIImage *) cachedImageForURL:(NSURL *)url;

JMImageCache.m

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ @interface JMImageCache ()
3131

3232
@property (strong, nonatomic) NSOperationQueue *diskOperationQueue;
3333

34-
- (void) _downloadAndWriteImageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion;
34+
- (void) _downloadAndWriteImageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure;
3535

3636
@end
3737

@@ -60,33 +60,58 @@ - (id) init {
6060
return self;
6161
}
6262

63-
- (void) _downloadAndWriteImageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion {
63+
- (void) _downloadAndWriteImageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure
64+
{
6465
if (!key && !url) return;
6566

6667
if (!key) {
6768
key = keyForURL(url);
6869
}
6970

7071
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
71-
NSData *data = [NSData dataWithContentsOfURL:url];
72-
UIImage *i = [[UIImage alloc] initWithData:data];
73-
// stop process if the method could not initialize the image from the specified data
74-
if (!i) return;
7572

76-
NSString *cachePath = cachePathForKey(key);
77-
NSInvocation *writeInvocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(writeData:toPath:)]];
78-
79-
[writeInvocation setTarget:self];
80-
[writeInvocation setSelector:@selector(writeData:toPath:)];
81-
[writeInvocation setArgument:&data atIndex:2];
82-
[writeInvocation setArgument:&cachePath atIndex:3];
83-
84-
[self performDiskWriteOperation:writeInvocation];
85-
[self setImage:i forKey:key];
86-
87-
dispatch_async(dispatch_get_main_queue(), ^{
88-
if(completion) completion(i);
89-
});
73+
NSURLRequest* request = [NSURLRequest requestWithURL:url];
74+
NSURLResponse* response = nil;
75+
NSError* error = nil;
76+
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
77+
78+
if (error)
79+
{
80+
dispatch_async(dispatch_get_main_queue(), ^{
81+
82+
if(failure) failure(request, response, error);
83+
});
84+
return;
85+
}
86+
87+
UIImage *i = [[UIImage alloc] initWithData:data];
88+
if (!i)
89+
{
90+
NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
91+
[errorDetail setValue:[NSString stringWithFormat:@"Failed to init image with data from for URL: %@", url] forKey:NSLocalizedDescriptionKey];
92+
NSError* error = [NSError errorWithDomain:@"JMImageCacheErrorDomain" code:1 userInfo:errorDetail];
93+
dispatch_async(dispatch_get_main_queue(), ^{
94+
95+
if(failure) failure(request, response, error);
96+
});
97+
}
98+
else
99+
{
100+
NSString *cachePath = cachePathForKey(key);
101+
NSInvocation *writeInvocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(writeData:toPath:)]];
102+
103+
[writeInvocation setTarget:self];
104+
[writeInvocation setSelector:@selector(writeData:toPath:)];
105+
[writeInvocation setArgument:&data atIndex:2];
106+
[writeInvocation setArgument:&cachePath atIndex:3];
107+
108+
[self performDiskWriteOperation:writeInvocation];
109+
[self setImage:i forKey:key];
110+
111+
dispatch_async(dispatch_get_main_queue(), ^{
112+
if(completion) completion(i);
113+
});
114+
}
90115
});
91116
}
92117

@@ -131,19 +156,19 @@ - (void) removeObjectForKey:(id)key {
131156
#pragma mark -
132157
#pragma mark Getter Methods
133158

134-
- (void) imageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion {
159+
- (void) imageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure{
135160

136161
UIImage *i = [self cachedImageForKey:key];
137162

138163
if(i) {
139164
if(completion) completion(i);
140165
} else {
141-
[self _downloadAndWriteImageForURL:url key:key completionBlock:completion];
166+
[self _downloadAndWriteImageForURL:url key:key completionBlock:completion failureBlock:failure];
142167
}
143168
}
144169

145-
- (void) imageForURL:(NSURL *)url completionBlock:(void (^)(UIImage *image))completion {
146-
[self imageForURL:url key:keyForURL(url) completionBlock:completion];
170+
- (void) imageForURL:(NSURL *)url completionBlock:(void (^)(UIImage *image))completion failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure{
171+
[self imageForURL:url key:keyForURL(url) completionBlock:completion failureBlock:(failure)];
147172
}
148173

149174
- (UIImage *) cachedImageForKey:(NSString *)key {
@@ -185,7 +210,8 @@ - (UIImage *) imageForURL:(NSURL *)url key:(NSString*)key delegate:(id<JMImageCa
185210
[d cache:self didDownloadImage:image forURL:url key:key];
186211
}
187212
}
188-
}];
213+
}
214+
failureBlock:nil];
189215
}
190216

191217
return nil;

UIImageView+JMImageCache.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
- (void) setImageWithURL:(NSURL *)url;
1414
- (void) setImageWithURL:(NSURL *)url placeholder:(UIImage *)placeholderImage;
1515
- (void) setImageWithURL:(NSURL *)url placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *))completionBlock;
16+
- (void) setImageWithURL:(NSURL *)url placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *))completionBlock failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure;
1617
- (void) setImageWithURL:(NSURL *)url key:(NSString*)key placeholder:(UIImage *)placeholderImage;
1718
- (void) setImageWithURL:(NSURL *)url key:(NSString*)key placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *image))completionBlock;
19+
- (void) setImageWithURL:(NSURL *)url key:(NSString*)key placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *image))completionBlock failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failure;
20+
1821

1922
@end

UIImageView+JMImageCache.m

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,18 @@ - (void) setImageWithURL:(NSURL *)url placeholder:(UIImage *)placeholderImage {
4444
[self setImageWithURL:url key:nil placeholder:placeholderImage];
4545
}
4646
- (void) setImageWithURL:(NSURL *)url placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *))completionBlock {
47-
[self setImageWithURL:url key:nil placeholder:placeholderImage completionBlock:completionBlock];
47+
[self setImageWithURL:url key:nil placeholder:placeholderImage completionBlock:completionBlock failureBlock:nil];
48+
}
49+
- (void) setImageWithURL:(NSURL *)url placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *))completionBlock failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failureBlock {
50+
[self setImageWithURL:url key:nil placeholder:placeholderImage completionBlock:completionBlock failureBlock:failureBlock];
4851
}
4952
- (void) setImageWithURL:(NSURL *)url key:(NSString*)key placeholder:(UIImage *)placeholderImage {
5053
[self setImageWithURL:url key:key placeholder:placeholderImage completionBlock:nil];
5154
}
5255
- (void) setImageWithURL:(NSURL *)url key:(NSString*)key placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *image))completionBlock {
56+
[self setImageWithURL:url key:key placeholder:placeholderImage completionBlock:completionBlock];
57+
}
58+
- (void) setImageWithURL:(NSURL *)url key:(NSString*)key placeholder:(UIImage *)placeholderImage completionBlock:(void (^)(UIImage *image))completionBlock failureBlock:(void (^)(NSURLRequest *request, NSURLResponse *response, NSError* error))failureBlock{
5359
self.jm_imageURL = url;
5460
self.image = placeholderImage;
5561

@@ -101,6 +107,10 @@ - (void) setImageWithURL:(NSURL *)url key:(NSString*)key placeholder:(UIImage *)
101107
if (completionBlock) completionBlock(image);
102108
});
103109
}
110+
}
111+
failureBlock:^(NSURLRequest *request, NSURLResponse *response, NSError* error)
112+
{
113+
if (failureBlock) failureBlock(request, response, error);
104114
}];
105115
}
106116
});

0 commit comments

Comments
 (0)