From 449a2cc5172fe9c16a9f9c1c1c9411d1cb47d51f Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Thu, 28 Apr 2016 03:16:16 -0500 Subject: [PATCH 1/6] added callbacks for entering and exiting fetch data and display ranges --- AsyncDisplayKit/ASDisplayNode+Subclasses.h | 5 ++ AsyncDisplayKit/ASDisplayNode.mm | 47 +++++++++++++++ AsyncDisplayKitTests/ASDisplayNodeTests.m | 68 ++++++++++++++++++++++ 3 files changed, 120 insertions(+) diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index 240f111f97..7422598e8a 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -242,6 +242,11 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)visibilityDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; +- (void)didEnterDisplayRange ASDISPLAYNODE_REQUIRES_SUPER; +- (void)didExitDisplayRange ASDISPLAYNODE_REQUIRES_SUPER; +- (void)didEnterFetchDataRange ASDISPLAYNODE_REQUIRES_SUPER; +- (void)didExitFetchDataRange ASDISPLAYNODE_REQUIRES_SUPER; + /** * Called just before the view is added to a window. */ diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 70ad272329..dc0bcf24c2 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -2084,6 +2084,8 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) ASDisplayNodeAssertMainThread(); } +#pragma mark Hierarchy State + - (void)willEnterHierarchy { ASDisplayNodeAssertMainThread(); @@ -2123,6 +2125,8 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) } } +#pragma mark Interface State + - (void)clearContents { // No-op if these haven't been created yet, as that guarantees they don't have contents that needs to be released. @@ -2174,6 +2178,26 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) // subclass override } +- (void)didEnterDisplayRange +{ + //subclass override +} + +- (void)didExitDisplayRange +{ + //subclass override +} + +- (void)didEnterFetchDataRange +{ + //subclass override +} + +- (void)didExitFetchDataRange +{ + //subclass override +} + /** * We currently only set interface state on nodes in table/collection views. For other nodes, if they are * in the hierarchy we enable all ASInterfaceState types with `ASInterfaceStateInHierarchy`, otherwise `None`. @@ -2276,11 +2300,34 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) [self visibilityDidChange:nowVisible]; } + BOOL nowInDisplay = ASInterfaceStateIncludesDisplay(newState); + BOOL wasInDisplay = ASInterfaceStateIncludesDisplay(oldState); + + if (nowInDisplay != wasInDisplay) { + if (nowInDisplay) { + [self didEnterDisplayRange]; + } else { + [self didExitDisplayRange]; + } + } + + BOOL nowInFetchData = ASInterfaceStateIncludesFetchData(newState); + BOOL wasInFetchData = ASInterfaceStateIncludesFetchData(oldState); + + if (nowInFetchData != wasInFetchData) { + if (nowInFetchData) { + [self didEnterFetchDataRange]; + } else { + [self didExitFetchDataRange]; + } + } + [self interfaceStateDidChange:newState fromState:oldState]; } - (void)interfaceStateDidChange:(ASInterfaceState)newState fromState:(ASInterfaceState)oldState { + // subclass hook } - (void)enterInterfaceState:(ASInterfaceState)interfaceState diff --git a/AsyncDisplayKitTests/ASDisplayNodeTests.m b/AsyncDisplayKitTests/ASDisplayNodeTests.m index 36b01040bf..a289f01b2f 100644 --- a/AsyncDisplayKitTests/ASDisplayNodeTests.m +++ b/AsyncDisplayKitTests/ASDisplayNodeTests.m @@ -86,6 +86,12 @@ for (ASDisplayNode *n in @[ nodes ]) {\ @property (atomic, copy) void (^willDeallocBlock)(ASTestDisplayNode *node); @property (atomic, copy) CGSize(^calculateSizeBlock)(ASTestDisplayNode *node, CGSize size); @property (atomic) BOOL hasFetchedData; + +@property (atomic) BOOL didCallEnterDisplayRange; +@property (atomic) BOOL didCallExitDisplayRange; + +@property (atomic) BOOL didCallEnterFetchDataRange; +@property (atomic) BOOL didCallExitFetchDataRange; @end @interface ASTestResponderNode : ASTestDisplayNode @@ -110,6 +116,30 @@ for (ASDisplayNode *n in @[ nodes ]) {\ self.hasFetchedData = NO; } +- (void)didEnterDisplayRange +{ + [super didEnterDisplayRange]; + self.didCallEnterDisplayRange = YES; +} + +- (void)didExitDisplayRange +{ + [super didExitDisplayRange]; + self.didCallExitDisplayRange = YES; +} + +- (void)didEnterFetchDataRange +{ + [super didEnterFetchDataRange]; + self.didCallEnterFetchDataRange = YES; +} + +- (void)didExitFetchDataRange +{ + [super didExitFetchDataRange]; + self.didCallExitFetchDataRange = YES; +} + - (void)dealloc { if (_willDeallocBlock) { @@ -1878,4 +1908,42 @@ static bool stringContainsPointer(NSString *description, const void *p) { XCTAssert(node.bounds.size.height == 8, @"Wrong ASDisplayNode.bounds.size.height"); } +//- (void)testDidEnterDisplayIsCalledWhenNodesEnterDisplayRange +//{ +// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; +// +// [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; +// +// XCTAssert([node didCallEnterDisplayRange]); +//} +// +//- (void)testDidExitDisplayIsCalledWhenNodesExitDisplayRange +//{ +// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; +// +// [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; +// [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; +// +// XCTAssert([node didCallExitDisplayRange]); +//} +// +//- (void)testDidEnterFetchDataIsCalledWhenNodesEnterFetchDataRange +//{ +// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; +// +// [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; +// +// XCTAssert([node didCallEnterFetchDataRange]); +//} +// +//- (void)testDidExitFetchDataIsCalledWhenNodesExitFetchDataRange +//{ +// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; +// +// [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; +// [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; +// +// XCTAssert([node didCallExitFetchDataRange]); +//} + @end From 4b2aa1fc59237ed4b7adf0741799d51799b93d14 Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Thu, 28 Apr 2016 03:27:53 -0500 Subject: [PATCH 2/6] added comments to header and cleaned up interface state did change --- AsyncDisplayKit/ASDisplayNode+Subclasses.h | 23 +++++++++++++++++ AsyncDisplayKit/ASDisplayNode.mm | 30 ++++++---------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index 7422598e8a..96fe28bf5f 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -242,9 +242,32 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)visibilityDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; +/** + * @abstract Called whenever the the node enters the display range. + * + * @discussion Subclasses may use this to monitor when they enter the display range. + */ - (void)didEnterDisplayRange ASDISPLAYNODE_REQUIRES_SUPER; + +/** + * @abstract Called whenever the the node exits the display range. + * + * @discussion Subclasses may use this to monitor when they exit the display range. + */ - (void)didExitDisplayRange ASDISPLAYNODE_REQUIRES_SUPER; + +/** + * @abstract Called whenever the the node enters the fetch data range. + * + * @discussion Subclasses may use this to monitor when they enter the fetch data range. + */ - (void)didEnterFetchDataRange ASDISPLAYNODE_REQUIRES_SUPER; + +/** + * @abstract Called whenever the the node exits the fetch data range. + * + * @discussion Subclasses may use this to monitor when they exit the fetch data range. + */ - (void)didExitFetchDataRange ASDISPLAYNODE_REQUIRES_SUPER; /** diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index dc0bcf24c2..d40a466573 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -2242,10 +2242,12 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) if (nowFetchData != wasFetchData) { if (nowFetchData) { [self fetchData]; + [self didEnterFetchDataRange]; } else { if ([self supportsRangeManagedInterfaceState]) { [self clearFetchedData]; } + [self didExitFetchDataRange]; } } @@ -2289,6 +2291,12 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) } } } + + if (nowDisplay) { + [self didEnterDisplayRange]; + } else { + [self didExitDisplayRange]; + } } // Became visible or invisible. When range-managed, this represents literal visibility - at least one pixel @@ -2299,29 +2307,7 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) if (nowVisible != wasVisible) { [self visibilityDidChange:nowVisible]; } - - BOOL nowInDisplay = ASInterfaceStateIncludesDisplay(newState); - BOOL wasInDisplay = ASInterfaceStateIncludesDisplay(oldState); - - if (nowInDisplay != wasInDisplay) { - if (nowInDisplay) { - [self didEnterDisplayRange]; - } else { - [self didExitDisplayRange]; - } - } - - BOOL nowInFetchData = ASInterfaceStateIncludesFetchData(newState); - BOOL wasInFetchData = ASInterfaceStateIncludesFetchData(oldState); - if (nowInFetchData != wasInFetchData) { - if (nowInFetchData) { - [self didEnterFetchDataRange]; - } else { - [self didExitFetchDataRange]; - } - } - [self interfaceStateDidChange:newState fromState:oldState]; } From 8526171b3032bad50e7fc889774342395547d607 Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Thu, 28 Apr 2016 03:39:12 -0500 Subject: [PATCH 3/6] reenabled new tests --- AsyncDisplayKitTests/ASDisplayNodeTests.m | 74 +++++++++++------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/AsyncDisplayKitTests/ASDisplayNodeTests.m b/AsyncDisplayKitTests/ASDisplayNodeTests.m index a289f01b2f..5ce3553215 100644 --- a/AsyncDisplayKitTests/ASDisplayNodeTests.m +++ b/AsyncDisplayKitTests/ASDisplayNodeTests.m @@ -1908,42 +1908,42 @@ static bool stringContainsPointer(NSString *description, const void *p) { XCTAssert(node.bounds.size.height == 8, @"Wrong ASDisplayNode.bounds.size.height"); } -//- (void)testDidEnterDisplayIsCalledWhenNodesEnterDisplayRange -//{ -// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; -// -// [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; -// -// XCTAssert([node didCallEnterDisplayRange]); -//} -// -//- (void)testDidExitDisplayIsCalledWhenNodesExitDisplayRange -//{ -// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; -// -// [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; -// [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; -// -// XCTAssert([node didCallExitDisplayRange]); -//} -// -//- (void)testDidEnterFetchDataIsCalledWhenNodesEnterFetchDataRange -//{ -// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; -// -// [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; -// -// XCTAssert([node didCallEnterFetchDataRange]); -//} -// -//- (void)testDidExitFetchDataIsCalledWhenNodesExitFetchDataRange -//{ -// ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; -// -// [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; -// [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; -// -// XCTAssert([node didCallExitFetchDataRange]); -//} +- (void)testDidEnterDisplayIsCalledWhenNodesEnterDisplayRange +{ + ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; + + [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; + + XCTAssert([node didCallEnterDisplayRange]); +} + +- (void)testDidExitDisplayIsCalledWhenNodesExitDisplayRange +{ + ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; + + [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; + [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; + + XCTAssert([node didCallExitDisplayRange]); +} + +- (void)testDidEnterFetchDataIsCalledWhenNodesEnterFetchDataRange +{ + ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; + + [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; + + XCTAssert([node didCallEnterFetchDataRange]); +} + +- (void)testDidExitFetchDataIsCalledWhenNodesExitFetchDataRange +{ + ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init]; + + [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; + [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; + + XCTAssert([node didCallExitFetchDataRange]); +} @end From d47059dffe242dfa541f3f30fb8a603321418e4d Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Wed, 4 May 2016 16:38:10 -0500 Subject: [PATCH 4/6] updated load and display did change methods --- AsyncDisplayKit/ASDisplayNode+Subclasses.h | 28 ++++-------- AsyncDisplayKit/ASDisplayNode.mm | 22 +++------- AsyncDisplayKitTests/ASDisplayNodeTests.m | 50 +++++++++++----------- 3 files changed, 39 insertions(+), 61 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index 96fe28bf5f..cba7216192 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -243,32 +243,22 @@ NS_ASSUME_NONNULL_BEGIN - (void)visibilityDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; /** - * @abstract Called whenever the the node enters the display range. + * @abstract Called whenever the the node has entered or left the display state. * - * @discussion Subclasses may use this to monitor when they enter the display range. + * @discussion Subclasses may use this to monitor when a node should be rendering its content. + * + * @note This method can be called from any thread and should therefore be thread safe. */ -- (void)didEnterDisplayRange ASDISPLAYNODE_REQUIRES_SUPER; +- (void)displayStateDidChange:(BOOL)inDisplayState ASDISPLAYNODE_REQUIRES_SUPER; /** - * @abstract Called whenever the the node exits the display range. + * @abstract Called whenever the the node has entered or left the load state. * - * @discussion Subclasses may use this to monitor when they exit the display range. - */ -- (void)didExitDisplayRange ASDISPLAYNODE_REQUIRES_SUPER; - -/** - * @abstract Called whenever the the node enters the fetch data range. + * @discussion Subclasses may use this to monitor data for a node should be loaded, either from a local or remote source. * - * @discussion Subclasses may use this to monitor when they enter the fetch data range. + * @note This method can be called from any thread and should therefore be thread safe. */ -- (void)didEnterFetchDataRange ASDISPLAYNODE_REQUIRES_SUPER; - -/** - * @abstract Called whenever the the node exits the fetch data range. - * - * @discussion Subclasses may use this to monitor when they exit the fetch data range. - */ -- (void)didExitFetchDataRange ASDISPLAYNODE_REQUIRES_SUPER; +- (void)loadStateDidChange:(BOOL)inLoadState ASDISPLAYNODE_REQUIRES_SUPER; /** * Called just before the view is added to a window. diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index d40a466573..2edbf7ec15 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -2178,22 +2178,12 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) // subclass override } -- (void)didEnterDisplayRange +- (void)displayStateDidChange:(BOOL)inDisplayState { //subclass override } -- (void)didExitDisplayRange -{ - //subclass override -} - -- (void)didEnterFetchDataRange -{ - //subclass override -} - -- (void)didExitFetchDataRange +- (void)loadStateDidChange:(BOOL)inLoadState { //subclass override } @@ -2242,12 +2232,12 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) if (nowFetchData != wasFetchData) { if (nowFetchData) { [self fetchData]; - [self didEnterFetchDataRange]; + [self loadStateDidChange:YES]; } else { if ([self supportsRangeManagedInterfaceState]) { [self clearFetchedData]; } - [self didExitFetchDataRange]; + [self loadStateDidChange:NO]; } } @@ -2293,9 +2283,9 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) } if (nowDisplay) { - [self didEnterDisplayRange]; + [self displayStateDidChange:YES]; } else { - [self didExitDisplayRange]; + [self displayStateDidChange:NO]; } } diff --git a/AsyncDisplayKitTests/ASDisplayNodeTests.m b/AsyncDisplayKitTests/ASDisplayNodeTests.m index 5ce3553215..c6c8ec8903 100644 --- a/AsyncDisplayKitTests/ASDisplayNodeTests.m +++ b/AsyncDisplayKitTests/ASDisplayNodeTests.m @@ -87,11 +87,11 @@ for (ASDisplayNode *n in @[ nodes ]) {\ @property (atomic, copy) CGSize(^calculateSizeBlock)(ASTestDisplayNode *node, CGSize size); @property (atomic) BOOL hasFetchedData; -@property (atomic) BOOL didCallEnterDisplayRange; -@property (atomic) BOOL didCallExitDisplayRange; +@property (atomic) BOOL displayRangeStateChangedToYES; +@property (atomic) BOOL displayRangeStateChangedToNO; -@property (atomic) BOOL didCallEnterFetchDataRange; -@property (atomic) BOOL didCallExitFetchDataRange; +@property (atomic) BOOL loadStateChangedToYES; +@property (atomic) BOOL loadStateChangedToNO; @end @interface ASTestResponderNode : ASTestDisplayNode @@ -116,28 +116,26 @@ for (ASDisplayNode *n in @[ nodes ]) {\ self.hasFetchedData = NO; } -- (void)didEnterDisplayRange +- (void)displayStateDidChange:(BOOL)inDisplayState { - [super didEnterDisplayRange]; - self.didCallEnterDisplayRange = YES; + [super displayStateDidChange:inDisplayState]; + + if (inDisplayState) { + self.displayRangeStateChangedToYES = YES; + } else { + self.displayRangeStateChangedToNO = YES; + } } -- (void)didExitDisplayRange +- (void)loadStateDidChange:(BOOL)inLoadState { - [super didExitDisplayRange]; - self.didCallExitDisplayRange = YES; -} - -- (void)didEnterFetchDataRange -{ - [super didEnterFetchDataRange]; - self.didCallEnterFetchDataRange = YES; -} - -- (void)didExitFetchDataRange -{ - [super didExitFetchDataRange]; - self.didCallExitFetchDataRange = YES; + [super loadStateDidChange:inLoadState]; + + if (inLoadState) { + self.loadStateChangedToYES = YES; + } else { + self.loadStateChangedToNO = YES; + } } - (void)dealloc @@ -1914,7 +1912,7 @@ static bool stringContainsPointer(NSString *description, const void *p) { [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; - XCTAssert([node didCallEnterDisplayRange]); + XCTAssert([node displayRangeStateChangedToYES]); } - (void)testDidExitDisplayIsCalledWhenNodesExitDisplayRange @@ -1924,7 +1922,7 @@ static bool stringContainsPointer(NSString *description, const void *p) { [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; - XCTAssert([node didCallExitDisplayRange]); + XCTAssert([node displayRangeStateChangedToNO]); } - (void)testDidEnterFetchDataIsCalledWhenNodesEnterFetchDataRange @@ -1933,7 +1931,7 @@ static bool stringContainsPointer(NSString *description, const void *p) { [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; - XCTAssert([node didCallEnterFetchDataRange]); + XCTAssert([node loadStateChangedToYES]); } - (void)testDidExitFetchDataIsCalledWhenNodesExitFetchDataRange @@ -1943,7 +1941,7 @@ static bool stringContainsPointer(NSString *description, const void *p) { [node recursivelySetInterfaceState:ASInterfaceStateFetchData]; [node recursivelySetInterfaceState:ASInterfaceStateDisplay]; - XCTAssert([node didCallExitFetchDataRange]); + XCTAssert([node loadStateChangedToNO]); } @end From e510120031bb0963eb3b67b25a0bb603293bc34d Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Wed, 4 May 2016 16:41:11 -0500 Subject: [PATCH 5/6] changed '-visibilityDidChange:' to '-visiblieStateDidChange:' to match the others --- AsyncDisplayKit/ASCellNode.mm | 4 ++-- AsyncDisplayKit/ASCollectionNode.mm | 4 ++-- AsyncDisplayKit/ASDisplayNode+Subclasses.h | 2 +- AsyncDisplayKit/ASDisplayNode.mm | 6 +++--- AsyncDisplayKit/ASImageNode+AnimatedImage.mm | 4 ++-- AsyncDisplayKit/ASMultiplexImageNode.mm | 4 ++-- AsyncDisplayKit/ASNetworkImageNode.mm | 4 ++-- AsyncDisplayKit/ASTableNode.mm | 4 ++-- AsyncDisplayKit/ASVideoNode.mm | 4 ++-- AsyncDisplayKit/Details/ASRangeController.mm | 2 +- AsyncDisplayKitTests/ASVideoNodeTests.m | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/AsyncDisplayKit/ASCellNode.mm b/AsyncDisplayKit/ASCellNode.mm index 0803c81f79..f6f3dfcef0 100644 --- a/AsyncDisplayKit/ASCellNode.mm +++ b/AsyncDisplayKit/ASCellNode.mm @@ -214,9 +214,9 @@ // To be overriden by subclasses } -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibileStateDidChange:isVisible]; CGRect cellFrame = CGRectZero; if (_scrollView) { diff --git a/AsyncDisplayKit/ASCollectionNode.mm b/AsyncDisplayKit/ASCollectionNode.mm index a29ee08cf2..be44e9362e 100644 --- a/AsyncDisplayKit/ASCollectionNode.mm +++ b/AsyncDisplayKit/ASCollectionNode.mm @@ -173,9 +173,9 @@ } #if ASRangeControllerLoggingEnabled -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibileStateDidChange:isVisible]; NSLog(@"%@ - visible: %d", self, isVisible); } #endif diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index cba7216192..53b1fa3d95 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -240,7 +240,7 @@ NS_ASSUME_NONNULL_BEGIN * * @discussion Subclasses may use this to monitor when they become visible. */ -- (void)visibilityDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; +- (void)visibileStateDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; /** * @abstract Called whenever the the node has entered or left the display state. diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 2edbf7ec15..7fc85d3c90 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -2106,7 +2106,7 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) if (![self supportsRangeManagedInterfaceState]) { self.interfaceState = ASInterfaceStateNone; } else { - // This case is important when tearing down hierarchies. We must deliver a visibilityDidChange:NO callback, as part our API guarantee that this method can be used for + // This case is important when tearing down hierarchies. We must deliver a visibileStateDidChange:NO callback, as part our API guarantee that this method can be used for // things like data analytics about user content viewing. We cannot call the method in the dealloc as any incidental retain operations in client code would fail. // Additionally, it may be that a Standard UIView which is containing us is moving between hierarchies, and we should not send the call if we will be re-added in the // same runloop. Strategy: strong reference (might be the last!), wait one runloop, and confirm we are still outside the hierarchy (both layer-backed and view-backed). @@ -2173,7 +2173,7 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) }); } -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { // subclass override } @@ -2295,7 +2295,7 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) BOOL wasVisible = ASInterfaceStateIncludesVisible(oldState); if (nowVisible != wasVisible) { - [self visibilityDidChange:nowVisible]; + [self visibileStateDidChange:nowVisible]; } [self interfaceStateDidChange:newState fromState:oldState]; diff --git a/AsyncDisplayKit/ASImageNode+AnimatedImage.mm b/AsyncDisplayKit/ASImageNode+AnimatedImage.mm index ffebb96317..df0da6554a 100644 --- a/AsyncDisplayKit/ASImageNode+AnimatedImage.mm +++ b/AsyncDisplayKit/ASImageNode+AnimatedImage.mm @@ -135,9 +135,9 @@ [self.animatedImage clearAnimatedImageCache]; } -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibileStateDidChange:isVisible]; ASDisplayNodeAssertMainThread(); if (isVisible) { diff --git a/AsyncDisplayKit/ASMultiplexImageNode.mm b/AsyncDisplayKit/ASMultiplexImageNode.mm index 8dca4e6495..22e87588e0 100644 --- a/AsyncDisplayKit/ASMultiplexImageNode.mm +++ b/AsyncDisplayKit/ASMultiplexImageNode.mm @@ -297,9 +297,9 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent /* visibilityDidChange in ASNetworkImageNode has a very similar implementation. Changes here are likely necessary in ASNetworkImageNode as well. */ -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibileStateDidChange:isVisible]; if (_downloaderImplementsSetPriority) { ASDN::MutexLocker l(_downloadIdentifierLock); diff --git a/AsyncDisplayKit/ASNetworkImageNode.mm b/AsyncDisplayKit/ASNetworkImageNode.mm index b9f6514fb7..bbac40e467 100755 --- a/AsyncDisplayKit/ASNetworkImageNode.mm +++ b/AsyncDisplayKit/ASNetworkImageNode.mm @@ -280,9 +280,9 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; /* visibilityDidChange in ASMultiplexImageNode has a very similar implementation. Changes here are likely necessary in ASMultiplexImageNode as well. */ -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibileStateDidChange:isVisible]; if (_downloaderImplementsSetPriority) { _lock.lock(); diff --git a/AsyncDisplayKit/ASTableNode.mm b/AsyncDisplayKit/ASTableNode.mm index 1642478d2d..ab65e6b4cd 100644 --- a/AsyncDisplayKit/ASTableNode.mm +++ b/AsyncDisplayKit/ASTableNode.mm @@ -145,9 +145,9 @@ } #if ASRangeControllerLoggingEnabled -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibileStateDidChange:isVisible]; NSLog(@"%@ - visible: %d", self, isVisible); } #endif diff --git a/AsyncDisplayKit/ASVideoNode.mm b/AsyncDisplayKit/ASVideoNode.mm index 89cb9fa5bb..98813e5c7b 100644 --- a/AsyncDisplayKit/ASVideoNode.mm +++ b/AsyncDisplayKit/ASVideoNode.mm @@ -382,9 +382,9 @@ static NSString * const kStatus = @"status"; } } -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibileStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibileStateDidChange:isVisible]; ASDN::MutexLocker l(_videoLock); diff --git a/AsyncDisplayKit/Details/ASRangeController.mm b/AsyncDisplayKit/Details/ASRangeController.mm index 7935564a3d..6a14b833ac 100644 --- a/AsyncDisplayKit/Details/ASRangeController.mm +++ b/AsyncDisplayKit/Details/ASRangeController.mm @@ -95,7 +95,7 @@ static UIApplicationState __ApplicationState = UIApplicationStateActive; { _scrollDirection = scrollDirection; - // Perform update immediately, so that cells receive a visibilityDidChange: call before their first pixel is visible. + // Perform update immediately, so that cells receive a visibileStateDidChange: call before their first pixel is visible. [self scheduleRangeUpdate]; } diff --git a/AsyncDisplayKitTests/ASVideoNodeTests.m b/AsyncDisplayKitTests/ASVideoNodeTests.m index f74ba735f9..6fec8701f2 100644 --- a/AsyncDisplayKitTests/ASVideoNodeTests.m +++ b/AsyncDisplayKitTests/ASVideoNodeTests.m @@ -223,7 +223,7 @@ }]; _videoNode.playerNode.layer.frame = CGRectZero; - [_videoNode visibilityDidChange:YES]; + [_videoNode visibileStateDidChange:YES]; XCTAssertTrue(_videoNode.shouldBePlaying); } From fc5467b110644b68ea83ca5743cc67c08fe00791 Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Mon, 6 Jun 2016 02:02:23 -0500 Subject: [PATCH 6/6] fixed typo and added backwards compatibility for 'visibilityDidChange' --- AsyncDisplayKit/ASCellNode.mm | 4 ++-- AsyncDisplayKit/ASCollectionNode.mm | 4 ++-- AsyncDisplayKit/ASDisplayNode+Subclasses.h | 11 +++++++++-- AsyncDisplayKit/ASDisplayNode.mm | 18 ++++++++++-------- AsyncDisplayKit/ASImageNode+AnimatedImage.mm | 4 ++-- AsyncDisplayKit/ASMultiplexImageNode.mm | 6 +++--- AsyncDisplayKit/ASNetworkImageNode.mm | 6 +++--- AsyncDisplayKit/ASTableNode.mm | 4 ++-- AsyncDisplayKit/ASVideoNode.mm | 4 ++-- AsyncDisplayKit/ASVideoPlayerNode.mm | 4 ++-- AsyncDisplayKit/Details/ASRangeController.mm | 2 +- AsyncDisplayKitTests/ASVideoNodeTests.m | 3 +-- 12 files changed, 39 insertions(+), 31 deletions(-) diff --git a/AsyncDisplayKit/ASCellNode.mm b/AsyncDisplayKit/ASCellNode.mm index f6f3dfcef0..cb50b6cb05 100644 --- a/AsyncDisplayKit/ASCellNode.mm +++ b/AsyncDisplayKit/ASCellNode.mm @@ -214,9 +214,9 @@ // To be overriden by subclasses } -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibileStateDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; CGRect cellFrame = CGRectZero; if (_scrollView) { diff --git a/AsyncDisplayKit/ASCollectionNode.mm b/AsyncDisplayKit/ASCollectionNode.mm index be44e9362e..2ddb0d35b8 100644 --- a/AsyncDisplayKit/ASCollectionNode.mm +++ b/AsyncDisplayKit/ASCollectionNode.mm @@ -173,9 +173,9 @@ } #if ASRangeControllerLoggingEnabled -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibileStateDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; NSLog(@"%@ - visible: %d", self, isVisible); } #endif diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index 53b1fa3d95..381184c849 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -240,10 +240,17 @@ NS_ASSUME_NONNULL_BEGIN * * @discussion Subclasses may use this to monitor when they become visible. */ -- (void)visibileStateDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; +- (void)visibilityDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; /** - * @abstract Called whenever the the node has entered or left the display state. + * @abstract Called whenever the visiblity of the node changed. + * + * @discussion Subclasses may use this to monitor when they become visible. + */ +- (void)visibleStateDidChange:(BOOL)isVisible ASDISPLAYNODE_REQUIRES_SUPER; + +/** + * @abstract Called whenever the the node has entered or exited the display state. * * @discussion Subclasses may use this to monitor when a node should be rendering its content. * diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 7fc85d3c90..293048f9ee 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -2173,9 +2173,14 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) }); } -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibilityDidChange:(BOOL)isVisible { - // subclass override + // subclass override +} + +- (void)visibleStateDidChange:(BOOL)isVisible +{ + // subclass override } - (void)displayStateDidChange:(BOOL)inDisplayState @@ -2282,11 +2287,7 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) } } - if (nowDisplay) { - [self displayStateDidChange:YES]; - } else { - [self displayStateDidChange:NO]; - } + [self displayStateDidChange:nowDisplay]; } // Became visible or invisible. When range-managed, this represents literal visibility - at least one pixel @@ -2295,7 +2296,8 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) BOOL wasVisible = ASInterfaceStateIncludesVisible(oldState); if (nowVisible != wasVisible) { - [self visibileStateDidChange:nowVisible]; + [self visibleStateDidChange:nowVisible]; + [self visibilityDidChange:nowVisible]; //TODO: remove once this method has been deprecated } [self interfaceStateDidChange:newState fromState:oldState]; diff --git a/AsyncDisplayKit/ASImageNode+AnimatedImage.mm b/AsyncDisplayKit/ASImageNode+AnimatedImage.mm index df0da6554a..d149a65e7c 100644 --- a/AsyncDisplayKit/ASImageNode+AnimatedImage.mm +++ b/AsyncDisplayKit/ASImageNode+AnimatedImage.mm @@ -135,9 +135,9 @@ [self.animatedImage clearAnimatedImageCache]; } -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibileStateDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; ASDisplayNodeAssertMainThread(); if (isVisible) { diff --git a/AsyncDisplayKit/ASMultiplexImageNode.mm b/AsyncDisplayKit/ASMultiplexImageNode.mm index 22e87588e0..d121a052f6 100644 --- a/AsyncDisplayKit/ASMultiplexImageNode.mm +++ b/AsyncDisplayKit/ASMultiplexImageNode.mm @@ -295,11 +295,11 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent } } -/* visibilityDidChange in ASNetworkImageNode has a very similar implementation. Changes here are likely necessary +/* visibileStateDidChange in ASNetworkImageNode has a very similar implementation. Changes here are likely necessary in ASNetworkImageNode as well. */ -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibileStateDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; if (_downloaderImplementsSetPriority) { ASDN::MutexLocker l(_downloadIdentifierLock); diff --git a/AsyncDisplayKit/ASNetworkImageNode.mm b/AsyncDisplayKit/ASNetworkImageNode.mm index bbac40e467..77158e93d4 100755 --- a/AsyncDisplayKit/ASNetworkImageNode.mm +++ b/AsyncDisplayKit/ASNetworkImageNode.mm @@ -278,11 +278,11 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; } } -/* visibilityDidChange in ASMultiplexImageNode has a very similar implementation. Changes here are likely necessary +/* visibileStateDidChange in ASMultiplexImageNode has a very similar implementation. Changes here are likely necessary in ASMultiplexImageNode as well. */ -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibileStateDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; if (_downloaderImplementsSetPriority) { _lock.lock(); diff --git a/AsyncDisplayKit/ASTableNode.mm b/AsyncDisplayKit/ASTableNode.mm index ab65e6b4cd..1e81e2e059 100644 --- a/AsyncDisplayKit/ASTableNode.mm +++ b/AsyncDisplayKit/ASTableNode.mm @@ -145,9 +145,9 @@ } #if ASRangeControllerLoggingEnabled -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibileStateDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; NSLog(@"%@ - visible: %d", self, isVisible); } #endif diff --git a/AsyncDisplayKit/ASVideoNode.mm b/AsyncDisplayKit/ASVideoNode.mm index 98813e5c7b..472a4d1f61 100644 --- a/AsyncDisplayKit/ASVideoNode.mm +++ b/AsyncDisplayKit/ASVideoNode.mm @@ -382,9 +382,9 @@ static NSString * const kStatus = @"status"; } } -- (void)visibileStateDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibileStateDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; ASDN::MutexLocker l(_videoLock); diff --git a/AsyncDisplayKit/ASVideoPlayerNode.mm b/AsyncDisplayKit/ASVideoPlayerNode.mm index ec19fda312..3e046e57a2 100644 --- a/AsyncDisplayKit/ASVideoPlayerNode.mm +++ b/AsyncDisplayKit/ASVideoPlayerNode.mm @@ -163,9 +163,9 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; } } -- (void)visibilityDidChange:(BOOL)isVisible +- (void)visibleStateDidChange:(BOOL)isVisible { - [super visibilityDidChange:isVisible]; + [super visibleStateDidChange:isVisible]; ASDN::MutexLocker l(_videoPlayerLock); diff --git a/AsyncDisplayKit/Details/ASRangeController.mm b/AsyncDisplayKit/Details/ASRangeController.mm index 6a14b833ac..6221ff02e0 100644 --- a/AsyncDisplayKit/Details/ASRangeController.mm +++ b/AsyncDisplayKit/Details/ASRangeController.mm @@ -95,7 +95,7 @@ static UIApplicationState __ApplicationState = UIApplicationStateActive; { _scrollDirection = scrollDirection; - // Perform update immediately, so that cells receive a visibileStateDidChange: call before their first pixel is visible. + // Perform update immediately, so that cells receive a visibleStateDidChange: call before their first pixel is visible. [self scheduleRangeUpdate]; } diff --git a/AsyncDisplayKitTests/ASVideoNodeTests.m b/AsyncDisplayKitTests/ASVideoNodeTests.m index 6fec8701f2..d03fdcfea2 100644 --- a/AsyncDisplayKitTests/ASVideoNodeTests.m +++ b/AsyncDisplayKitTests/ASVideoNodeTests.m @@ -223,12 +223,11 @@ }]; _videoNode.playerNode.layer.frame = CGRectZero; - [_videoNode visibileStateDidChange:YES]; + [_videoNode visibleStateDidChange:YES]; XCTAssertTrue(_videoNode.shouldBePlaying); } - - (void)testVideoShouldPauseWhenItLeavesVisibleButShouldKnowPlayingShouldRestartLater { _videoNode.asset = _firstAsset;