From ef84e996730015fb14322768731dac2d9124e79b Mon Sep 17 00:00:00 2001 From: Michael Schneider Date: Mon, 5 Dec 2016 20:00:06 -0800 Subject: [PATCH] Tremendously make the implementation easier --- AsyncDisplayKit.xcodeproj/project.pbxproj | 4 -- AsyncDisplayKit/ASImageNode.mm | 5 --- AsyncDisplayKit/ASMultiplexImageNode.mm | 16 +++++--- AsyncDisplayKit/ASNetworkImageNode.mm | 24 ++++++----- AsyncDisplayKit/ASVideoNode.mm | 41 +++++-------------- AsyncDisplayKit/Private/ASImageNode+Private.h | 27 ------------ AsyncDisplayKitTests/ASVideoNodeTests.m | 1 - 7 files changed, 35 insertions(+), 83 deletions(-) delete mode 100644 AsyncDisplayKit/Private/ASImageNode+Private.h diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index afcf74a6ad..7e7bd1a9c4 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -204,7 +204,6 @@ 6907C2591DC4ECFE00374C66 /* ASObjectDescriptionHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 6907C2571DC4ECFE00374C66 /* ASObjectDescriptionHelpers.m */; }; 6907C25A1DC4ECFE00374C66 /* ASObjectDescriptionHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 6907C2571DC4ECFE00374C66 /* ASObjectDescriptionHelpers.m */; }; 69127CFE1DD2B387004BF6E2 /* ASEventLog.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 696F01EA1DD2AF450049FBD5 /* ASEventLog.h */; }; - 69309D461DF3B1B50089FA48 /* ASImageNode+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 69309D451DF3B1B50089FA48 /* ASImageNode+Private.h */; }; 693117CE1DC7C72700DE4784 /* ASDisplayNode+Deprecated.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 683489271D70DE3400327501 /* ASDisplayNode+Deprecated.h */; }; 69527B121DC84292004785FB /* ASLayoutElementStylePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 69527B111DC84292004785FB /* ASLayoutElementStylePrivate.h */; }; 6959433E1D70815300B0EE1F /* ASDisplayNodeLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6959433C1D70815300B0EE1F /* ASDisplayNodeLayout.mm */; }; @@ -1003,7 +1002,6 @@ 68FC85E81CE29C7D00EDD713 /* ASVisibilityProtocols.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASVisibilityProtocols.m; sourceTree = ""; }; 6907C2561DC4ECFE00374C66 /* ASObjectDescriptionHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASObjectDescriptionHelpers.h; sourceTree = ""; }; 6907C2571DC4ECFE00374C66 /* ASObjectDescriptionHelpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASObjectDescriptionHelpers.m; sourceTree = ""; }; - 69309D451DF3B1B50089FA48 /* ASImageNode+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ASImageNode+Private.h"; sourceTree = ""; }; 69527B111DC84292004785FB /* ASLayoutElementStylePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASLayoutElementStylePrivate.h; path = AsyncDisplayKit/Layout/ASLayoutElementStylePrivate.h; sourceTree = SOURCE_ROOT; }; 6959433C1D70815300B0EE1F /* ASDisplayNodeLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASDisplayNodeLayout.mm; sourceTree = ""; }; 6959433D1D70815300B0EE1F /* ASDisplayNodeLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASDisplayNodeLayout.h; sourceTree = ""; }; @@ -1611,7 +1609,6 @@ 68B8A4DB1CBD911D007E4543 /* ASImageNode+AnimatedImagePrivate.h */, 058D0A0D195D050800B7D73C /* ASImageNode+CGExtras.h */, 058D0A0E195D050800B7D73C /* ASImageNode+CGExtras.m */, - 69309D451DF3B1B50089FA48 /* ASImageNode+Private.h */, ACF6ED431B17847A00DA7C62 /* ASInternalHelpers.h */, ACF6ED441B17847A00DA7C62 /* ASInternalHelpers.m */, 69C4CAF51DA3147000B1EC9B /* ASLayoutElementStylePrivate.h */, @@ -1860,7 +1857,6 @@ 34EFC7631B701CBF00AD841F /* ASCenterLayoutSpec.h in Headers */, 9C70F20C1CDBE9B6007D6C76 /* ASCollectionDataController.h in Headers */, 18C2ED7F1B9B7DE800F627B3 /* ASCollectionNode.h in Headers */, - 69309D461DF3B1B50089FA48 /* ASImageNode+Private.h in Headers */, 9C8898BD1C738BB800D6B02E /* ASTextKitFontSizeAdjuster.h in Headers */, B35061F51B010EFD0018CF92 /* ASCollectionView.h in Headers */, ACE87A2C1D73696800D7FF06 /* ASSectionContext.h in Headers */, diff --git a/AsyncDisplayKit/ASImageNode.mm b/AsyncDisplayKit/ASImageNode.mm index 153c8d95c3..2678a7e8a9 100644 --- a/AsyncDisplayKit/ASImageNode.mm +++ b/AsyncDisplayKit/ASImageNode.mm @@ -199,11 +199,6 @@ struct ASImageNodeDrawParameters { #pragma mark - Setter / Getter - (void)setImage:(UIImage *)image -{ - [self __setImage:image]; -} - -- (void)__setImage:(UIImage *)image { ASDN::MutexLocker l(__instanceLock__); if (!ASObjectIsEqual(_image, image)) { diff --git a/AsyncDisplayKit/ASMultiplexImageNode.mm b/AsyncDisplayKit/ASMultiplexImageNode.mm index a406050009..4275516078 100644 --- a/AsyncDisplayKit/ASMultiplexImageNode.mm +++ b/AsyncDisplayKit/ASMultiplexImageNode.mm @@ -11,7 +11,6 @@ #if TARGET_OS_IOS #import "ASMultiplexImageNode.h" -#import "ASImageNode+Private.h" #import #import "ASAvailability.h" @@ -234,7 +233,7 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent // setting this to nil makes the node fetch images the next time its display starts _loadedImageIdentifier = nil; - [self __setImage:nil]; + [self _setImage:nil]; } - (void)didEnterPreloadState @@ -329,7 +328,12 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent - (void)setImage:(UIImage *)image { ASDisplayNodeAssert(NO, @"Setting the image directly on an ASMultiplexImageNode is unsafe. It will be cleared in didExitPreloadRange and will have no way to restore in didEnterPreloadRange"); - [self __setImage:image]; + super.image = image; +} + +- (void)_setImage:(UIImage *)image +{ + super.image = image; } - (void)setDelegate:(id )delegate @@ -527,7 +531,7 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent if (ASObjectIsEqual(strongSelf->_downloadIdentifier, downloadIdentifier) == NO && downloadIdentifier != nil) { return; } - [self __setImage:progressImage]; + [strongSelf _setImage:progressImage]; }; } [_downloader setProgressImageBlock:progress callbackQueue:dispatch_get_main_queue() withDownloadIdentifier:_downloadIdentifier]; @@ -545,7 +549,7 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent if (shouldReleaseImageOnBackgroundThread) { ASPerformBackgroundDeallocation(image); } - [self __setImage:nil]; + [self _setImage:nil]; } #pragma mark - @@ -874,7 +878,7 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent UIImage *previousImage = self.image; self.loadedImageIdentifier = imageIdentifier; - [self __setImage:image]; + [self _setImage:image]; if (_delegateFlags.updatedImage) { [_delegate multiplexImageNode:self didUpdateImage:image withIdentifier:imageIdentifier fromImage:previousImage withIdentifier:previousIdentifier]; diff --git a/AsyncDisplayKit/ASNetworkImageNode.mm b/AsyncDisplayKit/ASNetworkImageNode.mm index 9278885664..5b0d3d6cb4 100755 --- a/AsyncDisplayKit/ASNetworkImageNode.mm +++ b/AsyncDisplayKit/ASNetworkImageNode.mm @@ -9,7 +9,6 @@ // #import "ASNetworkImageNode.h" -#import "ASImageNode+Private.h" #import "ASBasicImageDownloader.h" #import "ASDisplayNodeInternal.h" @@ -137,7 +136,12 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; } __instanceLock__.unlock(); - [self __setImage:image]; + [self _setImage:image]; +} + +- (void)_setImage:(UIImage *)image +{ + super.image = image; } - (void)setURL:(NSURL *)URL @@ -167,7 +171,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; BOOL hasURL = _URL == nil; if (reset || hasURL) { - [self __setImage:_defaultImage]; + [self _setImage:_defaultImage]; /* We want to maintain the order that currentImageQuality is set regardless of the calling thread, so always use a dispatch_async to ensure that we queue the operations in the correct order. (see comment in displayDidFinish) */ @@ -202,7 +206,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; dispatch_async(dispatch_get_main_queue(), ^{ self.currentImageQuality = hasURL ? 0.0 : 1.0; }); - [self __setImage:defaultImage]; + [self _setImage:defaultImage]; } } @@ -287,7 +291,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; if (_imageLoaded == NO && _URL && _downloadIdentifier == nil) { UIImage *result = [[_cache synchronouslyFetchedCachedImageWithURL:_URL] asdk_image]; if (result) { - [self __setImage:result]; + [self _setImage:result]; _imageLoaded = YES; dispatch_async(dispatch_get_main_queue(), ^{ _currentImageQuality = 1.0; @@ -372,7 +376,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; if (ASObjectIsEqual(_downloadIdentifier, downloadIdentifier) == NO && downloadIdentifier != nil) { return; } - [self __setImage:progressImage]; + [self _setImage:progressImage]; dispatch_async(dispatch_get_main_queue(), ^{ // See comment in -displayDidFinish for why this must be dispatched to main self.currentImageQuality = progress; @@ -437,7 +441,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; ASPerformBackgroundDeallocation(image); } self.animatedImage = nil; - [self __setImage:_defaultImage]; + [self _setImage:_defaultImage]; _imageLoaded = NO; // See comment in -displayDidFinish for why this must be dispatched to main dispatch_async(dispatch_get_main_queue(), ^{ @@ -497,7 +501,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; dispatch_async(dispatch_get_main_queue(), ^{ if (self.shouldCacheImage) { - [self __setImage:[UIImage imageNamed:_URL.path.lastPathComponent]]; + [self _setImage:[UIImage imageNamed:_URL.path.lastPathComponent]]; } else { // First try to load the path directly, for efficiency assuming a developer who // doesn't want caching is trying to be as minimal as possible. @@ -527,7 +531,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; if (animatedImage != nil) { self.animatedImage = animatedImage; } else { - [self __setImage:nonAnimatedImage]; + [self _setImage:nonAnimatedImage]; } } @@ -563,7 +567,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; if ([imageContainer asdk_animatedImageData] && _downloaderFlags.downloaderImplementsAnimatedImage) { strongSelf.animatedImage = [_downloader animatedImageWithData:[imageContainer asdk_animatedImageData]]; } else { - [strongSelf __setImage:[imageContainer asdk_image]]; + [strongSelf _setImage:[imageContainer asdk_image]]; } dispatch_async(dispatch_get_main_queue(), ^{ strongSelf->_currentImageQuality = 1.0; diff --git a/AsyncDisplayKit/ASVideoNode.mm b/AsyncDisplayKit/ASVideoNode.mm index fedaf02f34..86e19ebe98 100644 --- a/AsyncDisplayKit/ASVideoNode.mm +++ b/AsyncDisplayKit/ASVideoNode.mm @@ -16,7 +16,6 @@ #import "ASEqualityHelpers.h" #import "ASInternalHelpers.h" #import "ASDisplayNodeExtras.h" -#import "ASImageNode+Private.h" static BOOL ASAssetIsEqual(AVAsset *asset1, AVAsset *asset2) { return ASObjectIsEqual(asset1, asset2) @@ -90,8 +89,7 @@ static NSString * const kRate = @"rate"; // TODO: Support preview images with HTTP Live Streaming videos. -#pragma mark - Lifecycle - +#pragma mark - Construction and Layout - (instancetype)init { @@ -229,22 +227,6 @@ static NSString * const kRate = @"rate"; } } -- (void)_fetchDataForVideoNode -{ - [self setNeedsPreload]; -} - -- (void)_clearVideoNode -{ - self.videoPlaceholderImage = nil; - self.player = nil; - self.currentItem = nil; - self.playerState = ASVideoNodePlayerStateUnknown; -} - -#pragma mark - Layout - - - (void)layout { [super layout]; @@ -430,7 +412,10 @@ static NSString * const kRate = @"rate"; { ASDN::MutexLocker l(__instanceLock__); - [self _clearVideoNode]; + + self.player = nil; + self.currentItem = nil; + self.playerState = ASVideoNodePlayerStateUnknown; } } @@ -521,15 +506,11 @@ static NSString * const kRate = @"rate"; - (void)_setAndFetchAsset:(AVAsset *)asset url:(NSURL *)assetURL { - [self _clearVideoNode]; - - { - ASDN::MutexLocker l(__instanceLock__); - _asset = asset; - _assetURL = assetURL; - } - - [self _fetchDataForVideoNode]; + [self setVideoPlaceholderImage:nil]; + [self didExitPreloadState]; + _asset = asset; + _assetURL = assetURL; + [self setNeedsPreload]; } - (void)setVideoComposition:(AVVideoComposition *)videoComposition @@ -638,7 +619,7 @@ static NSString * const kRate = @"rate"; } if (_player == nil) { - [self _fetchDataForVideoNode]; + [self setNeedsPreload]; } if (_playerNode == nil) { diff --git a/AsyncDisplayKit/Private/ASImageNode+Private.h b/AsyncDisplayKit/Private/ASImageNode+Private.h deleted file mode 100644 index 676af72ec0..0000000000 --- a/AsyncDisplayKit/Private/ASImageNode+Private.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// ASImageNode+Private.h -// AsyncDisplayKit -// -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#pragma mark - ASImageNode - -#import "ASImageNode.h" - -@interface ASImageNode (Private) - -/* - * Set the image property of the ASImageNode. Subclasses like ASNetworkImageNode do not allow setting the - * image property directly and throw an assertion. There still needs to be a way for subclasses of - * ASNetworkImageNode to set the image. - * - * This is exposed to library subclasses, i.e. ASNetworkImageNode, ASMultiplexImageNode and ASVideoNode for setting - * the image directly without going throug the setter of the superclass - */ -- (void)__setImage:(UIImage *)image; - -@end diff --git a/AsyncDisplayKitTests/ASVideoNodeTests.m b/AsyncDisplayKitTests/ASVideoNodeTests.m index edbc57ece1..3c835c5e2f 100644 --- a/AsyncDisplayKitTests/ASVideoNodeTests.m +++ b/AsyncDisplayKitTests/ASVideoNodeTests.m @@ -410,7 +410,6 @@ [_videoNode didExitPreloadState]; XCTAssertNil(_videoNode.player); XCTAssertNil(_videoNode.currentItem); - XCTAssertNil(_videoNode.image); } - (void)testDelegateProperlySetForClassHierarchy