From 362c41ae80bbf08df4056065b035ec6cf45b4adc Mon Sep 17 00:00:00 2001 From: Adlai Holler Date: Mon, 11 Apr 2016 12:51:16 -0700 Subject: [PATCH] [ASNetworkImageNode] Attach progress image handler even if download starts while already visible --- AsyncDisplayKit/ASNetworkImageNode.mm | 59 ++++++++++++++------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/AsyncDisplayKit/ASNetworkImageNode.mm b/AsyncDisplayKit/ASNetworkImageNode.mm index 3a0c341510..258575f0d1 100755 --- a/AsyncDisplayKit/ASNetworkImageNode.mm +++ b/AsyncDisplayKit/ASNetworkImageNode.mm @@ -14,6 +14,7 @@ #import "ASEqualityHelpers.h" #import "ASThread.h" #import "ASInternalHelpers.h" +#import "ASDisplayNodeExtras.h" #if PIN_REMOTE_IMAGE #import "ASPINRemoteImageDownloader.h" @@ -211,9 +212,8 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; - (void)visibilityDidChange:(BOOL)isVisible { [super visibilityDidChange:isVisible]; - + ASDN::MutexLocker l(_lock); if (_downloaderImplementsSetPriority) { - ASDN::MutexLocker l(_lock); if (_downloadIdentifier != nil) { if (isVisible) { [_downloader setPriority:ASImageDownloaderPriorityVisible withDownloadIdentifier:_downloadIdentifier]; @@ -222,32 +222,8 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; } } } - - if (_downloaderImplementsSetProgress) { - ASDN::MutexLocker l(_lock); - - if (_downloadIdentifier != nil) { - __weak __typeof__(self) weakSelf = self; - ASImageDownloaderProgressImage progress = nil; - if (isVisible) { - progress = ^(UIImage * _Nonnull progressImage, id _Nullable downloadIdentifier) { - __typeof__(self) strongSelf = weakSelf; - if (strongSelf == nil) { - return; - } - - ASDN::MutexLocker l(strongSelf->_lock); - //Getting a result back for a different download identifier, download must not have been successfully canceled - if (!ASObjectIsEqual(strongSelf->_downloadIdentifier, downloadIdentifier) && downloadIdentifier != nil) { - return; - } - - strongSelf.image = progressImage; - }; - } - [_downloader setProgressImageBlock:progress callbackQueue:dispatch_get_main_queue() withDownloadIdentifier:_downloadIdentifier]; - } - } + + [self _updateProgressImageBlockOnDownloaderIfNeeded]; } - (void)clearFetchedData @@ -277,6 +253,32 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; #pragma mark - Private methods -- only call with lock. +- (void)_updateProgressImageBlockOnDownloaderIfNeeded +{ + if (!_downloaderImplementsSetProgress || _downloadIdentifier == nil) { + return; + } + + ASImageDownloaderProgressImage progress = nil; + if (ASInterfaceStateIncludesVisible(self.interfaceState)) { + __weak __typeof__(self) weakSelf = self; + progress = ^(UIImage * _Nonnull progressImage, id _Nullable downloadIdentifier) { + __typeof__(self) strongSelf = weakSelf; + if (strongSelf == nil) { + return; + } + + ASDN::MutexLocker l(strongSelf->_lock); + //Getting a result back for a different download identifier, download must not have been successfully canceled + if (ASObjectIsEqual(strongSelf->_downloadIdentifier, downloadIdentifier) == NO && downloadIdentifier != nil) { + return; + } + strongSelf.image = progressImage; + }; + } + [_downloader setProgressImageBlock:progress callbackQueue:dispatch_get_main_queue() withDownloadIdentifier:_downloadIdentifier]; +} + - (void)_clearImage { // Destruction of bigger images on the main thread can be expensive @@ -335,6 +337,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; }]; #pragma clang diagnostic pop } + [self _updateProgressImageBlockOnDownloaderIfNeeded]; }); }