Merge pull request #2475 from zhongwuzw/add_autoreleasepool_to_gcd_block
Add autoreleasepool to release autorelease objects in advance when using GCD for 4.x
This commit is contained in:
commit
88d3e281ca
|
@ -345,17 +345,19 @@ didReceiveResponse:(NSURLResponse *)response
|
||||||
|
|
||||||
// progressive decode the image in coder queue
|
// progressive decode the image in coder queue
|
||||||
dispatch_async(self.coderQueue, ^{
|
dispatch_async(self.coderQueue, ^{
|
||||||
UIImage *image = [self.progressiveCoder incrementallyDecodedImageWithData:imageData finished:finished];
|
@autoreleasepool {
|
||||||
if (image) {
|
UIImage *image = [self.progressiveCoder incrementallyDecodedImageWithData:imageData finished:finished];
|
||||||
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL];
|
if (image) {
|
||||||
image = [self scaledImageForKey:key image:image];
|
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL];
|
||||||
if (self.shouldDecompressImages) {
|
image = [self scaledImageForKey:key image:image];
|
||||||
image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}];
|
if (self.shouldDecompressImages) {
|
||||||
|
image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}];
|
||||||
|
}
|
||||||
|
|
||||||
|
// We do not keep the progressive decoding image even when `finished`=YES. Because they are for view rendering but not take full function from downloader options. And some coders implementation may not keep consistent between progressive decoding and normal decoding.
|
||||||
|
|
||||||
|
[self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
// We do not keep the progressive decoding image even when `finished`=YES. Because they are for view rendering but not take full function from downloader options. And some coders implementation may not keep consistent between progressive decoding and normal decoding.
|
|
||||||
|
|
||||||
[self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO];
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -416,36 +418,38 @@ didReceiveResponse:(NSURLResponse *)response
|
||||||
} else {
|
} else {
|
||||||
// decode the image in coder queue
|
// decode the image in coder queue
|
||||||
dispatch_async(self.coderQueue, ^{
|
dispatch_async(self.coderQueue, ^{
|
||||||
UIImage *image = [[SDWebImageCodersManager sharedInstance] decodedImageWithData:imageData];
|
@autoreleasepool {
|
||||||
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL];
|
UIImage *image = [[SDWebImageCodersManager sharedInstance] decodedImageWithData:imageData];
|
||||||
image = [self scaledImageForKey:key image:image];
|
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL];
|
||||||
|
image = [self scaledImageForKey:key image:image];
|
||||||
BOOL shouldDecode = YES;
|
|
||||||
// Do not force decoding animated GIFs and WebPs
|
BOOL shouldDecode = YES;
|
||||||
if (image.images) {
|
// Do not force decoding animated GIFs and WebPs
|
||||||
shouldDecode = NO;
|
if (image.images) {
|
||||||
} else {
|
|
||||||
#ifdef SD_WEBP
|
|
||||||
SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:imageData];
|
|
||||||
if (imageFormat == SDImageFormatWebP) {
|
|
||||||
shouldDecode = NO;
|
shouldDecode = NO;
|
||||||
}
|
} else {
|
||||||
|
#ifdef SD_WEBP
|
||||||
|
SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:imageData];
|
||||||
|
if (imageFormat == SDImageFormatWebP) {
|
||||||
|
shouldDecode = NO;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldDecode) {
|
|
||||||
if (self.shouldDecompressImages) {
|
|
||||||
BOOL shouldScaleDown = self.options & SDWebImageDownloaderScaleDownLargeImages;
|
|
||||||
image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(shouldScaleDown)}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shouldDecode) {
|
||||||
|
if (self.shouldDecompressImages) {
|
||||||
|
BOOL shouldScaleDown = self.options & SDWebImageDownloaderScaleDownLargeImages;
|
||||||
|
image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(shouldScaleDown)}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CGSize imageSize = image.size;
|
||||||
|
if (imageSize.width == 0 || imageSize.height == 0) {
|
||||||
|
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]];
|
||||||
|
} else {
|
||||||
|
[self callCompletionBlocksWithImage:image imageData:imageData error:nil finished:YES];
|
||||||
|
}
|
||||||
|
[self done];
|
||||||
}
|
}
|
||||||
CGSize imageSize = image.size;
|
|
||||||
if (imageSize.width == 0 || imageSize.height == 0) {
|
|
||||||
[self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]];
|
|
||||||
} else {
|
|
||||||
[self callCompletionBlocksWithImage:image imageData:imageData error:nil finished:YES];
|
|
||||||
}
|
|
||||||
[self done];
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -243,28 +243,32 @@
|
||||||
// Image refresh hit the NSURLCache cache, do not call the completion block
|
// Image refresh hit the NSURLCache cache, do not call the completion block
|
||||||
} else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) {
|
} else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) {
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
||||||
UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url];
|
@autoreleasepool {
|
||||||
|
UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url];
|
||||||
if (transformedImage && finished) {
|
|
||||||
BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage];
|
if (transformedImage && finished) {
|
||||||
NSData *cacheData;
|
BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage];
|
||||||
// pass nil if the image was transformed, so we can recalculate the data from the image
|
NSData *cacheData;
|
||||||
if (self.cacheSerializer) {
|
// pass nil if the image was transformed, so we can recalculate the data from the image
|
||||||
cacheData = self.cacheSerializer(transformedImage, (imageWasTransformed ? nil : downloadedData), url);
|
if (self.cacheSerializer) {
|
||||||
} else {
|
cacheData = self.cacheSerializer(transformedImage, (imageWasTransformed ? nil : downloadedData), url);
|
||||||
cacheData = (imageWasTransformed ? nil : downloadedData);
|
} else {
|
||||||
|
cacheData = (imageWasTransformed ? nil : downloadedData);
|
||||||
|
}
|
||||||
|
[self.imageCache storeImage:transformedImage imageData:cacheData forKey:key toDisk:cacheOnDisk completion:nil];
|
||||||
}
|
}
|
||||||
[self.imageCache storeImage:transformedImage imageData:cacheData forKey:key toDisk:cacheOnDisk completion:nil];
|
|
||||||
|
[self callCompletionBlockForOperation:strongSubOperation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url];
|
||||||
}
|
}
|
||||||
|
|
||||||
[self callCompletionBlockForOperation:strongSubOperation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url];
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (downloadedImage && finished) {
|
if (downloadedImage && finished) {
|
||||||
if (self.cacheSerializer) {
|
if (self.cacheSerializer) {
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
||||||
NSData *cacheData = self.cacheSerializer(downloadedImage, downloadedData, url);
|
@autoreleasepool {
|
||||||
[self.imageCache storeImage:downloadedImage imageData:cacheData forKey:key toDisk:cacheOnDisk completion:nil];
|
NSData *cacheData = self.cacheSerializer(downloadedImage, downloadedData, url);
|
||||||
|
[self.imageCache storeImage:downloadedImage imageData:cacheData forKey:key toDisk:cacheOnDisk completion:nil];
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
[self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil];
|
[self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil];
|
||||||
|
|
Loading…
Reference in New Issue