Wrapping JSON and image processing in GCD async dispatch

This commit is contained in:
Mattt Thompson 2011-08-09 14:53:23 -05:00
parent 662af980c3
commit f9073df97b
2 changed files with 45 additions and 39 deletions

View file

@ -47,26 +47,28 @@ static inline CGSize kAFImageRequestRoundedCornerRadii(CGSize imageSize) {
success:(void (^)(UIImage *image))success success:(void (^)(UIImage *image))success
{ {
return [self operationWithRequest:urlRequest completion:^(NSURLRequest *request, NSHTTPURLResponse *response, NSData *data, NSError *error) { return [self operationWithRequest:urlRequest completion:^(NSURLRequest *request, NSHTTPURLResponse *response, NSData *data, NSError *error) {
UIImage *image = nil;
if ([[UIScreen mainScreen] scale] == 2.0) {
CGImageRef imageRef = [[UIImage imageWithData:data] CGImage];
image = [UIImage imageWithCGImage:imageRef scale:2.0 orientation:UIImageOrientationUp];
} else {
image = [UIImage imageWithData:data];
}
if (!(CGSizeEqualToSize(image.size, imageSize) || CGSizeEqualToSize(imageSize, CGSizeZero))) {
image = [UIImage imageByScalingAndCroppingImage:image size:imageSize];
}
if ((options & AFImageRequestRoundCorners)) {
image = [UIImage imageByRoundingCornersOfImage:image corners:UIRectCornerAllCorners cornerRadii:kAFImageRequestRoundedCornerRadii(image.size)];
}
if (success) {
success(image);
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
UIImage *image = nil;
if ([[UIScreen mainScreen] scale] == 2.0) {
CGImageRef imageRef = [[UIImage imageWithData:data] CGImage];
image = [UIImage imageWithCGImage:imageRef scale:2.0 orientation:UIImageOrientationUp];
} else {
image = [UIImage imageWithData:data];
}
if (!(CGSizeEqualToSize(image.size, imageSize) || CGSizeEqualToSize(imageSize, CGSizeZero))) {
image = [UIImage imageByScalingAndCroppingImage:image size:imageSize];
}
if ((options & AFImageRequestRoundCorners)) {
image = [UIImage imageByRoundingCornersOfImage:image corners:UIRectCornerAllCorners cornerRadii:kAFImageRequestRoundedCornerRadii(image.size)];
}
dispatch_sync(dispatch_get_main_queue(), ^(void) {
if (success) {
success(image);
}
});
[[AFImageCache sharedImageCache] cacheImage:image forRequest:request imageSize:imageSize options:options]; [[AFImageCache sharedImageCache] cacheImage:image forRequest:request imageSize:imageSize options:options];
}); });
}]; }];

View file

@ -62,27 +62,31 @@
failure(error); failure(error);
} }
} else { } else {
id JSON = nil; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
id JSON = nil;
#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3
if ([NSJSONSerialization class]) { if ([NSJSONSerialization class]) {
JSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; JSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
} else { } else {
JSON = [[JSONDecoder decoder] objectWithData:data error:&error];
}
#else
JSON = [[JSONDecoder decoder] objectWithData:data error:&error]; JSON = [[JSONDecoder decoder] objectWithData:data error:&error];
} #endif
#else
JSON = [[JSONDecoder decoder] objectWithData:data error:&error];
#endif
if (error) { dispatch_sync(dispatch_get_main_queue(), ^(void) {
if (failure) { if (error) {
failure(error); if (failure) {
} failure(error);
} else { }
if (success) { } else {
success(JSON); if (success) {
} success(JSON);
} }
}
});
});
} }
}]; }];
} }