diff --git a/AsyncDisplayKit/ASMultiplexImageNode.mm b/AsyncDisplayKit/ASMultiplexImageNode.mm index 5eb0abcfcb..483dfb9973 100644 --- a/AsyncDisplayKit/ASMultiplexImageNode.mm +++ b/AsyncDisplayKit/ASMultiplexImageNode.mm @@ -21,6 +21,7 @@ #import "ASLog.h" #import "ASPhotosFrameworkImageRequest.h" #import "ASEqualityHelpers.h" +#import "ASInternalHelpers.h" #if !AS_IOS8_SDK_OR_LATER #error ASMultiplexImageNode can be used on iOS 7, but must be linked against the iOS 8 SDK. @@ -751,46 +752,48 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent } // Download! - if (_downloaderSupportsNewProtocol) { - [self _setDownloadIdentifier:[_downloader downloadImageWithURL:imageURL - callbackQueue:dispatch_get_main_queue() - downloadProgress:downloadProgressBlock - completion:^(UIImage *downloadedImage, NSError *error, id downloadIdentifier) { - // We dereference iVars directly, so we can't have weakSelf going nil on us. - __typeof__(self) strongSelf = weakSelf; - if (!strongSelf) - return; - - ASDN::MutexLocker l(_downloadIdentifierLock); - //Getting a result back for a different download identifier, download must not have been successfully canceled - if (ASObjectIsEqual(_downloadIdentifier, downloadIdentifier) == NO && downloadIdentifier != nil) { - return; - } - - completionBlock(downloadedImage, error); - - // Delegateify. - if (strongSelf->_delegateFlags.downloadFinish) - [strongSelf->_delegate multiplexImageNode:weakSelf didFinishDownloadingImageWithIdentifier:imageIdentifier error:error]; - }]]; - } else { - [self _setDownloadIdentifier:[_downloader downloadImageWithURL:imageURL - callbackQueue:dispatch_get_main_queue() - downloadProgressBlock:downloadProgressBlock - completion:^(CGImageRef coreGraphicsImage, NSError *error) { - // We dereference iVars directly, so we can't have weakSelf going nil on us. - __typeof__(self) strongSelf = weakSelf; - if (!strongSelf) - return; - - UIImage *downloadedImage = (coreGraphicsImage ? [UIImage imageWithCGImage:coreGraphicsImage] : nil); - completionBlock(downloadedImage, error); - - // Delegateify. - if (strongSelf->_delegateFlags.downloadFinish) - [strongSelf->_delegate multiplexImageNode:weakSelf didFinishDownloadingImageWithIdentifier:imageIdentifier error:error]; - }]]; - } + ASPerformBlockOnBackgroundThread(^{ + if (_downloaderSupportsNewProtocol) { + [self _setDownloadIdentifier:[_downloader downloadImageWithURL:imageURL + callbackQueue:dispatch_get_main_queue() + downloadProgress:downloadProgressBlock + completion:^(UIImage *downloadedImage, NSError *error, id downloadIdentifier) { + // We dereference iVars directly, so we can't have weakSelf going nil on us. + __typeof__(self) strongSelf = weakSelf; + if (!strongSelf) + return; + + ASDN::MutexLocker l(_downloadIdentifierLock); + //Getting a result back for a different download identifier, download must not have been successfully canceled + if (ASObjectIsEqual(_downloadIdentifier, downloadIdentifier) == NO && downloadIdentifier != nil) { + return; + } + + completionBlock(downloadedImage, error); + + // Delegateify. + if (strongSelf->_delegateFlags.downloadFinish) + [strongSelf->_delegate multiplexImageNode:weakSelf didFinishDownloadingImageWithIdentifier:imageIdentifier error:error]; + }]]; + } else { + [self _setDownloadIdentifier:[_downloader downloadImageWithURL:imageURL + callbackQueue:dispatch_get_main_queue() + downloadProgressBlock:downloadProgressBlock + completion:^(CGImageRef coreGraphicsImage, NSError *error) { + // We dereference iVars directly, so we can't have weakSelf going nil on us. + __typeof__(self) strongSelf = weakSelf; + if (!strongSelf) + return; + + UIImage *downloadedImage = (coreGraphicsImage ? [UIImage imageWithCGImage:coreGraphicsImage] : nil); + completionBlock(downloadedImage, error); + + // Delegateify. + if (strongSelf->_delegateFlags.downloadFinish) + [strongSelf->_delegate multiplexImageNode:weakSelf didFinishDownloadingImageWithIdentifier:imageIdentifier error:error]; + }]]; + } + }); } #pragma mark - diff --git a/AsyncDisplayKit/ASNetworkImageNode.mm b/AsyncDisplayKit/ASNetworkImageNode.mm index 3b5eb75db9..55263c1051 100755 --- a/AsyncDisplayKit/ASNetworkImageNode.mm +++ b/AsyncDisplayKit/ASNetworkImageNode.mm @@ -13,6 +13,7 @@ #import "ASDisplayNode+FrameworkPrivate.h" #import "ASEqualityHelpers.h" #import "ASThread.h" +#import "ASInternalHelpers.h" #if PIN_REMOTE_IMAGE #import "ASPINRemoteImageDownloader.h" @@ -263,25 +264,28 @@ - (void)_downloadImageWithCompletion:(void (^)(UIImage *image, NSError*, id downloadIdentifier))finished { - if (_downloaderSupportsNewProtocol) { - _downloadIdentifier = [_downloader downloadImageWithURL:_URL - callbackQueue:dispatch_get_main_queue() - downloadProgress:NULL - completion:^(UIImage * _Nullable image, NSError * _Nullable error, id _Nullable downloadIdentifier) { - if (finished != NULL) { - finished(image, error, downloadIdentifier); - } - }]; - } else { - _downloadIdentifier = [_downloader downloadImageWithURL:_URL - callbackQueue:dispatch_get_main_queue() - downloadProgressBlock:NULL - completion:^(CGImageRef responseImage, NSError *error) { - if (finished != NULL) { - finished([UIImage imageWithCGImage:responseImage], error, nil); - } - }]; - } + ASPerformBlockOnBackgroundThread(^{ + ASDN::MutexLocker l(_lock); + if (_downloaderSupportsNewProtocol) { + _downloadIdentifier = [_downloader downloadImageWithURL:_URL + callbackQueue:dispatch_get_main_queue() + downloadProgress:NULL + completion:^(UIImage * _Nullable image, NSError * _Nullable error, id _Nullable downloadIdentifier) { + if (finished != NULL) { + finished(image, error, downloadIdentifier); + } + }]; + } else { + _downloadIdentifier = [_downloader downloadImageWithURL:_URL + callbackQueue:dispatch_get_main_queue() + downloadProgressBlock:NULL + completion:^(CGImageRef responseImage, NSError *error) { + if (finished != NULL) { + finished([UIImage imageWithCGImage:responseImage], error, nil); + } + }]; + } + }); } - (void)_lazilyLoadImageIfNecessary