Assert node did load before did enter visible way 1 (#886)

* fix SIMULATE_WEB_RESPONSE not imported #449

* Fix to make rangeMode update in right time

* access layer to load node before enter visible

* revert space
This commit is contained in:
Max Wang 2018-10-24 12:58:57 -07:00 committed by Michael Schneider
parent 097790317e
commit 14681c00c4
4 changed files with 24 additions and 6 deletions

View File

@ -1,5 +1,6 @@
## master ## master
* Add your own contributions to the next release on the line below this with your name. * Add your own contributions to the next release on the line below this with your name.
- [ASDisplayNode.m] Make sure node is loaded before enter visible. [Max Wang](https://github.com/wsdwsd0829). [#886](https://github.com/TextureGroup/Texture/pull/886)
- [ASTextNode2] Add improved support for all line-break modes in experimental text node. [Kevin Smith](https://github.com/wiseoldduck). [#1150](https://github.com/TextureGroup/Texture/pull/1150) - [ASTextNode2] Add improved support for all line-break modes in experimental text node. [Kevin Smith](https://github.com/wiseoldduck). [#1150](https://github.com/TextureGroup/Texture/pull/1150)
- [ASExperimentalFeatures.m] Fix mismatch name in experimental features. [Max Wang](https://github.com/wsdwsd0829). [#1159](https://github.com/TextureGroup/Texture/pull/1159) - [ASExperimentalFeatures.m] Fix mismatch name in experimental features. [Max Wang](https://github.com/wsdwsd0829). [#1159](https://github.com/TextureGroup/Texture/pull/1159)
- [ASCollectionViewLayoutController] Set default tuning parameters before view is loaded. [Max Wang](https://github.com/wsdwsd0829). [#1158](https://github.com/TextureGroup/Texture/pull/1158) - [ASCollectionViewLayoutController] Set default tuning parameters before view is loaded. [Max Wang](https://github.com/wsdwsd0829). [#1158](https://github.com/TextureGroup/Texture/pull/1158)

View File

@ -2265,7 +2265,14 @@ ASDISPLAYNODE_INLINE BOOL subtreeIsRasterized(ASDisplayNode *node) {
[_subnodes insertObject:subnode atIndex:subnodeIndex]; [_subnodes insertObject:subnode atIndex:subnodeIndex];
_cachedSubnodes = nil; _cachedSubnodes = nil;
__instanceLock__.unlock(); __instanceLock__.unlock();
if (!isRasterized && self.nodeLoaded) {
// Trigger the subnode to load its layer, which will create its view if it needs one.
// By doing this prior to downward propagation of .interfaceState in _setSupernode:,
// we can guarantee that -didEnterVisibleState is only called with .isNodeLoaded = YES.
[subnode layer];
}
// This call will apply our .hierarchyState to the new subnode. // This call will apply our .hierarchyState to the new subnode.
// If we are a managed hierarchy, as in ASCellNode trees, it will also apply our .interfaceState. // If we are a managed hierarchy, as in ASCellNode trees, it will also apply our .interfaceState.
[subnode _setSupernode:self]; [subnode _setSupernode:self];
@ -3272,10 +3279,17 @@ ASDISPLAYNODE_INLINE BOOL subtreeIsRasterized(ASDisplayNode *node) {
{ {
// subclass override // subclass override
ASDisplayNodeAssertMainThread(); ASDisplayNodeAssertMainThread();
// Rasterized node's loading state is merged with root node of rasterized tree.
if (!(self.hierarchyState & ASHierarchyStateRasterized)) {
ASDisplayNodeAssert(self.isNodeLoaded, @"Node should be loaded before entering visible state.");
}
ASAssertUnlocked(__instanceLock__); ASAssertUnlocked(__instanceLock__);
[self enumerateInterfaceStateDelegates:^(id<ASInterfaceStateDelegate> del) { [self enumerateInterfaceStateDelegates:^(id<ASInterfaceStateDelegate> del) {
[del didEnterVisibleState]; [del didEnterVisibleState];
}]; }];
#if AS_ENABLE_TIPS #if AS_ENABLE_TIPS
[ASTipsController.shared nodeDidAppear:self]; [ASTipsController.shared nodeDidAppear:self];
#endif #endif

View File

@ -57,6 +57,7 @@
- (void)testThatProgressBlockIsSetAndClearedCorrectlyOnChangeURL - (void)testThatProgressBlockIsSetAndClearedCorrectlyOnChangeURL
{ {
[node layer];
[node enterInterfaceState:ASInterfaceStateInHierarchy]; [node enterInterfaceState:ASInterfaceStateInHierarchy];
// Set URL while visible, should set progress block // Set URL while visible, should set progress block

View File

@ -199,9 +199,9 @@
- (void)doPlayerLayerNodeIsNotAddedIfVisibleButShouldNotBePlaying - (void)doPlayerLayerNodeIsNotAddedIfVisibleButShouldNotBePlaying
{ {
[_videoNode pause]; [_videoNode pause];
[_videoNode layer];
[_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay]; [_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay];
[_videoNode didLoad];
XCTAssert(![_videoNode.subnodes containsObject:_videoNode.playerNode]); XCTAssert(![_videoNode.subnodes containsObject:_videoNode.playerNode]);
} }
@ -226,7 +226,8 @@
return playerLayer; return playerLayer;
}]; }];
_videoNode.playerNode.layer.frame = CGRectZero; _videoNode.playerNode.layer.frame = CGRectZero;
[_videoNode layer];
[_videoNode didEnterVisibleState]; [_videoNode didEnterVisibleState];
XCTAssertTrue(_videoNode.shouldBePlaying); XCTAssertTrue(_videoNode.shouldBePlaying);
@ -304,7 +305,7 @@
_videoNode.asset = assetMock; _videoNode.asset = assetMock;
_videoNode.shouldAutorepeat = NO; _videoNode.shouldAutorepeat = NO;
[_videoNode didLoad]; [_videoNode layer];
[_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay | ASInterfaceStatePreload]; [_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay | ASInterfaceStatePreload];
[_videoNode prepareToPlayAsset:assetMock withKeys:_requestedKeys]; [_videoNode prepareToPlayAsset:assetMock withKeys:_requestedKeys];
[_videoNode play]; [_videoNode play];
@ -325,7 +326,7 @@
_videoNode.asset = assetMock; _videoNode.asset = assetMock;
_videoNode.shouldAutorepeat = YES; _videoNode.shouldAutorepeat = YES;
[_videoNode didLoad]; [_videoNode layer];
[_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay | ASInterfaceStatePreload]; [_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay | ASInterfaceStatePreload];
[_videoNode prepareToPlayAsset:assetMock withKeys:_requestedKeys]; [_videoNode prepareToPlayAsset:assetMock withKeys:_requestedKeys];
[_videoNode play]; [_videoNode play];
@ -342,6 +343,7 @@
_videoNode.asset = assetMock; _videoNode.asset = assetMock;
[_videoNode layer];
[_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay | ASInterfaceStatePreload]; [_videoNode setInterfaceState:ASInterfaceStateVisible | ASInterfaceStateDisplay | ASInterfaceStatePreload];
[_videoNode prepareToPlayAsset:assetMock withKeys:_requestedKeys]; [_videoNode prepareToPlayAsset:assetMock withKeys:_requestedKeys];
ASCATransactionQueueWait(nil); ASCATransactionQueueWait(nil);