From 599bf426756f737501fa0af8d468b53f5c5e972a Mon Sep 17 00:00:00 2001 From: Ryan Nystrom Date: Wed, 25 Feb 2015 10:46:00 -0800 Subject: [PATCH] Revisions based on feedback --- AsyncDisplayKit.xcodeproj/project.pbxproj | 40 +++++++++---------- AsyncDisplayKit/ASDisplayNode+Subclasses.h | 5 ++- AsyncDisplayKit/ASDisplayNode.mm | 1 + .../Details/ASFlowLayoutController.mm | 16 ++++---- .../Details/ASPreloadRangeDelegate.mm | 26 ------------ AsyncDisplayKit/Details/ASRangeController.h | 2 +- AsyncDisplayKit/Details/ASRangeController.mm | 27 +++++++------ .../{ASRangeDelegate.h => ASRangeHandler.h} | 6 +-- ...angeDelegate.h => ASRangeHandlerPreload.h} | 4 +- .../Details/ASRangeHandlerPreload.mm | 28 +++++++++++++ ...RangeDelegate.h => ASRangeHandlerRender.h} | 4 +- ...ngeDelegate.mm => ASRangeHandlerRender.mm} | 18 ++++----- 12 files changed, 91 insertions(+), 86 deletions(-) delete mode 100644 AsyncDisplayKit/Details/ASPreloadRangeDelegate.mm rename AsyncDisplayKit/Details/{ASRangeDelegate.h => ASRangeHandler.h} (67%) rename AsyncDisplayKit/Details/{ASPreloadRangeDelegate.h => ASRangeHandlerPreload.h} (76%) create mode 100644 AsyncDisplayKit/Details/ASRangeHandlerPreload.mm rename AsyncDisplayKit/Details/{ASRenderRangeDelegate.h => ASRangeHandlerRender.h} (77%) rename AsyncDisplayKit/Details/{ASRenderRangeDelegate.mm => ASRangeHandlerRender.mm} (70%) diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index e08de9ab04..3571f15925 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -139,11 +139,11 @@ 1950C4491A3BB5C1005C8279 /* ASEqualityHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 1950C4481A3BB5C1005C8279 /* ASEqualityHelpers.h */; }; 2911485C1A77147A005D0878 /* ASControlNodeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2911485B1A77147A005D0878 /* ASControlNodeTests.m */; }; 292C599F1A956527007E5DD6 /* ASLayoutRangeType.h in Headers */ = {isa = PBXBuildFile; fileRef = 292C59991A956527007E5DD6 /* ASLayoutRangeType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 292C59A01A956527007E5DD6 /* ASPreloadRangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 292C599A1A956527007E5DD6 /* ASPreloadRangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 292C59A11A956527007E5DD6 /* ASPreloadRangeDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 292C599B1A956527007E5DD6 /* ASPreloadRangeDelegate.mm */; }; - 292C59A21A956527007E5DD6 /* ASRangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 292C599C1A956527007E5DD6 /* ASRangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 292C59A31A956527007E5DD6 /* ASRenderRangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 292C599D1A956527007E5DD6 /* ASRenderRangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 292C59A41A956527007E5DD6 /* ASRenderRangeDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 292C599E1A956527007E5DD6 /* ASRenderRangeDelegate.mm */; }; + 292C59A01A956527007E5DD6 /* ASRangeHandlerPreload.h in Headers */ = {isa = PBXBuildFile; fileRef = 292C599A1A956527007E5DD6 /* ASRangeHandlerPreload.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 292C59A11A956527007E5DD6 /* ASRangeHandlerPreload.mm in Sources */ = {isa = PBXBuildFile; fileRef = 292C599B1A956527007E5DD6 /* ASRangeHandlerPreload.mm */; }; + 292C59A21A956527007E5DD6 /* ASRangeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 292C599C1A956527007E5DD6 /* ASRangeHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 292C59A31A956527007E5DD6 /* ASRangeHandlerRender.h in Headers */ = {isa = PBXBuildFile; fileRef = 292C599D1A956527007E5DD6 /* ASRangeHandlerRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 292C59A41A956527007E5DD6 /* ASRangeHandlerRender.mm in Sources */ = {isa = PBXBuildFile; fileRef = 292C599E1A956527007E5DD6 /* ASRangeHandlerRender.mm */; }; 3C9C128519E616EF00E942A0 /* ASTableViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C9C128419E616EF00E942A0 /* ASTableViewTests.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 464052201A3F83C40061C0BA /* ASDataController.h in Headers */ = {isa = PBXBuildFile; fileRef = 464052191A3F83C40061C0BA /* ASDataController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 464052211A3F83C40061C0BA /* ASDataController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4640521A1A3F83C40061C0BA /* ASDataController.mm */; }; @@ -291,11 +291,11 @@ 1950C4481A3BB5C1005C8279 /* ASEqualityHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASEqualityHelpers.h; sourceTree = ""; }; 2911485B1A77147A005D0878 /* ASControlNodeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASControlNodeTests.m; sourceTree = ""; }; 292C59991A956527007E5DD6 /* ASLayoutRangeType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASLayoutRangeType.h; sourceTree = ""; }; - 292C599A1A956527007E5DD6 /* ASPreloadRangeDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASPreloadRangeDelegate.h; sourceTree = ""; }; - 292C599B1A956527007E5DD6 /* ASPreloadRangeDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASPreloadRangeDelegate.mm; sourceTree = ""; }; - 292C599C1A956527007E5DD6 /* ASRangeDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASRangeDelegate.h; sourceTree = ""; }; - 292C599D1A956527007E5DD6 /* ASRenderRangeDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASRenderRangeDelegate.h; sourceTree = ""; }; - 292C599E1A956527007E5DD6 /* ASRenderRangeDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASRenderRangeDelegate.mm; sourceTree = ""; }; + 292C599A1A956527007E5DD6 /* ASRangeHandlerPreload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASRangeHandlerPreload.h; sourceTree = ""; }; + 292C599B1A956527007E5DD6 /* ASRangeHandlerPreload.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASRangeHandlerPreload.mm; sourceTree = ""; }; + 292C599C1A956527007E5DD6 /* ASRangeHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASRangeHandler.h; sourceTree = ""; }; + 292C599D1A956527007E5DD6 /* ASRangeHandlerRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASRangeHandlerRender.h; sourceTree = ""; }; + 292C599E1A956527007E5DD6 /* ASRangeHandlerRender.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASRangeHandlerRender.mm; sourceTree = ""; }; 3C9C128419E616EF00E942A0 /* ASTableViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASTableViewTests.m; sourceTree = ""; }; 464052191A3F83C40061C0BA /* ASDataController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASDataController.h; sourceTree = ""; }; 4640521A1A3F83C40061C0BA /* ASDataController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASDataController.mm; sourceTree = ""; }; @@ -483,13 +483,13 @@ 058D09E9195D050800B7D73C /* ASMutableAttributedStringBuilder.m */, 055F1A3619ABD413004DAFF1 /* ASRangeController.h */, 055F1A3719ABD413004DAFF1 /* ASRangeController.mm */, - 292C599A1A956527007E5DD6 /* ASPreloadRangeDelegate.h */, - 292C599B1A956527007E5DD6 /* ASPreloadRangeDelegate.mm */, + 292C599A1A956527007E5DD6 /* ASRangeHandlerPreload.h */, + 292C599B1A956527007E5DD6 /* ASRangeHandlerPreload.mm */, 055F1A3619ABD413004DAFF1 /* ASRangeController.h */, 055F1A3719ABD413004DAFF1 /* ASRangeController.mm */, - 292C599C1A956527007E5DD6 /* ASRangeDelegate.h */, - 292C599D1A956527007E5DD6 /* ASRenderRangeDelegate.h */, - 292C599E1A956527007E5DD6 /* ASRenderRangeDelegate.mm */, + 292C599C1A956527007E5DD6 /* ASRangeHandler.h */, + 292C599D1A956527007E5DD6 /* ASRangeHandlerRender.h */, + 292C599E1A956527007E5DD6 /* ASRangeHandlerRender.mm */, 058D09EA195D050800B7D73C /* ASTextNodeCoreTextAdditions.h */, 058D09EB195D050800B7D73C /* ASTextNodeCoreTextAdditions.m */, 058D09EC195D050800B7D73C /* ASTextNodeRenderer.h */, @@ -595,7 +595,7 @@ 058D0A51195D05CB00B7D73C /* ASTextNode.h in Headers */, 058D0A52195D05CB00B7D73C /* ASTextNode.mm in Headers */, 055F1A3819ABD413004DAFF1 /* ASRangeController.h in Headers */, - 292C59A31A956527007E5DD6 /* ASRenderRangeDelegate.h in Headers */, + 292C59A31A956527007E5DD6 /* ASRangeHandlerRender.h in Headers */, 055F1A3419ABD3E3004DAFF1 /* ASTableView.h in Headers */, 0574D5E219C110940097DC25 /* ASTableViewProtocols.h in Headers */, 055F1A3C19ABD43F004DAFF1 /* ASCellNode.h in Headers */, @@ -638,7 +638,7 @@ 058D0A83195D060300B7D73C /* ASBaseDefines.h in Headers */, 058D0A84195D060300B7D73C /* ASDisplayNodeExtraIvars.h in Headers */, AC3C4A511A1139C100143C57 /* ASCollectionView.h in Headers */, - 292C59A01A956527007E5DD6 /* ASPreloadRangeDelegate.h in Headers */, + 292C59A01A956527007E5DD6 /* ASRangeHandlerPreload.h in Headers */, 055B9FA81A1C154B00035D6D /* ASNetworkImageNode.h in Headers */, 054963491A1EA066000F8E56 /* ASBasicImageDownloader.h in Headers */, AC3C4A541A113EEC00143C57 /* ASCollectionViewProtocols.h in Headers */, @@ -658,7 +658,7 @@ 058D0A7B195D05F900B7D73C /* ASDisplayNodeInternal.h in Headers */, 058D0A7C195D05F900B7D73C /* ASImageNode+CGExtras.h in Headers */, 058D0A7D195D05F900B7D73C /* ASImageNode+CGExtras.m in Headers */, - 292C59A21A956527007E5DD6 /* ASRangeDelegate.h in Headers */, + 292C59A21A956527007E5DD6 /* ASRangeHandler.h in Headers */, 058D0A7F195D05F900B7D73C /* ASSentinel.h in Headers */, 058D0A80195D05F900B7D73C /* ASSentinel.m in Headers */, 058D0A81195D05F900B7D73C /* ASThread.h in Headers */, @@ -795,10 +795,10 @@ 464052261A3F83C40061C0BA /* ASMultidimensionalArrayUtils.mm in Sources */, 055B9FA91A1C154B00035D6D /* ASNetworkImageNode.mm in Sources */, 058D0A1D195D050800B7D73C /* ASTextNodeRenderer.mm in Sources */, - 292C59A41A956527007E5DD6 /* ASRenderRangeDelegate.mm in Sources */, + 292C59A41A956527007E5DD6 /* ASRangeHandlerRender.mm in Sources */, 058D0A2A195D050800B7D73C /* ASDisplayNode+UIViewBridge.mm in Sources */, AC3C4A521A1139C100143C57 /* ASCollectionView.mm in Sources */, - 292C59A11A956527007E5DD6 /* ASPreloadRangeDelegate.mm in Sources */, + 292C59A11A956527007E5DD6 /* ASRangeHandlerPreload.mm in Sources */, 058D0A20195D050800B7D73C /* ASTextNodeWordKerner.m in Sources */, 058D0A1A195D050800B7D73C /* ASHighlightOverlayLayer.mm in Sources */, 464052231A3F83C40061C0BA /* ASFlowLayoutController.mm in Sources */, diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index 40de2a0047..303f6c1a18 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -320,7 +320,8 @@ - (void)didExitHierarchy ASDISPLAYNODE_REQUIRES_SUPER; /** - * Provides an opportunity to clear backing store and other memory-intensive intermediates, such as text layout managers. + * Provides an opportunity to clear backing store and other memory-intensive intermediates, such as text layout managers + * on the current node. * * @discussion Called by -recursivelyClearRendering. Base class implements self.contents = nil, clearing any backing * store, for asynchronous regeneration when needed. @@ -328,7 +329,7 @@ - (void)clearRendering ASDISPLAYNODE_REQUIRES_SUPER; /** - * Provides an opportunity to clear any remote data for only the current node. + * Provides an opportunity to clear any remote data on the current node. * * @discussion This will not clear data recursively for all subnodes. Either call -recursivelyClearRemoteData or * selectively clear remote data. diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 73817598c4..c95f9128cd 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -91,6 +91,7 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)()) ASDisplayNodeAssert(!ASDisplayNodeSubclassOverridesSelector(self, @selector(calculatedSize)), @"Subclass %@ must not override calculatedSize method", NSStringFromClass(self)); ASDisplayNodeAssert(!ASDisplayNodeSubclassOverridesSelector(self, @selector(measure:)), @"Subclass %@ must not override measure method", NSStringFromClass(self)); ASDisplayNodeAssert(!ASDisplayNodeSubclassOverridesSelector(self, @selector(recursivelyClearRendering)), @"Subclass %@ must not override recursivelyClearRendering method", NSStringFromClass(self)); + ASDisplayNodeAssert(!ASDisplayNodeSubclassOverridesSelector(self, @selector(recursivelyClearRemoteData)), @"Subclass %@ must not override recursivelyClearRemoteData method", NSStringFromClass(self)); } + (BOOL)layerBackedNodesEnabled diff --git a/AsyncDisplayKit/Details/ASFlowLayoutController.mm b/AsyncDisplayKit/Details/ASFlowLayoutController.mm index b093a05d16..eb07c1c002 100644 --- a/AsyncDisplayKit/Details/ASFlowLayoutController.mm +++ b/AsyncDisplayKit/Details/ASFlowLayoutController.mm @@ -25,7 +25,7 @@ static const CGFloat kASFlowLayoutControllerRefreshingThreshold = 0.3; std::vector> _rangeStartPos; std::vector> _rangeEndPos; - std::vector _tuningParameterMap; + std::vector _tuningParameters; } @end @@ -39,12 +39,12 @@ static const CGFloat kASFlowLayoutControllerRefreshingThreshold = 0.3; _layoutDirection = layoutDirection; - _tuningParameterMap = std::vector(2); - _tuningParameterMap[ASLayoutRangeTypePreload] = { + _tuningParameters = std::vector(ASLayoutRangeTypeCount); + _tuningParameters[ASLayoutRangeTypePreload] = { .leadingBufferScreenfuls = 2, .trailingBufferScreenfuls = 1 }; - _tuningParameterMap[ASLayoutRangeTypeRender] = { + _tuningParameters[ASLayoutRangeTypeRender] = { .leadingBufferScreenfuls = 3, .trailingBufferScreenfuls = 2 }; @@ -56,14 +56,14 @@ static const CGFloat kASFlowLayoutControllerRefreshingThreshold = 0.3; - (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType { - ASDisplayNodeAssert(rangeType < _tuningParameterMap.size(), @"Requesting a range that is OOB for the configured tuning parameters"); - return _tuningParameterMap[rangeType]; + ASDisplayNodeAssert(rangeType < _tuningParameters.size(), @"Requesting a range that is OOB for the configured tuning parameters"); + return _tuningParameters[rangeType]; } - (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType { - ASDisplayNodeAssert(rangeType < _tuningParameterMap.size(), @"Requesting a range that is OOB for the configured tuning parameters"); - _tuningParameterMap[rangeType] = tuningParameters; + ASDisplayNodeAssert(rangeType < _tuningParameters.size(), @"Requesting a range that is OOB for the configured tuning parameters"); + _tuningParameters[rangeType] = tuningParameters; } // Support for the deprecated tuningParameters property diff --git a/AsyncDisplayKit/Details/ASPreloadRangeDelegate.mm b/AsyncDisplayKit/Details/ASPreloadRangeDelegate.mm deleted file mode 100644 index c8a83881fc..0000000000 --- a/AsyncDisplayKit/Details/ASPreloadRangeDelegate.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* 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. - */ - -#import "ASPreloadRangeDelegate.h" - -#import "ASDisplayNode.h" -#import "ASDisplayNode+Subclasses.h" - -@implementation ASPreloadRangeDelegate - -- (void)node:(ASDisplayNode *)node enteredRangeType:(ASLayoutRangeType)rangeType -{ - [node fetchRemoteData]; -} - -- (void)node:(ASDisplayNode *)node exitedRangeType:(ASLayoutRangeType)rangeType -{ - [node clearRemoteData]; -} - -@end diff --git a/AsyncDisplayKit/Details/ASRangeController.h b/AsyncDisplayKit/Details/ASRangeController.h index 10a2ccd061..e50be5706d 100644 --- a/AsyncDisplayKit/Details/ASRangeController.h +++ b/AsyncDisplayKit/Details/ASRangeController.h @@ -20,7 +20,7 @@ * Working range controller. * * Used internally by ASTableView and potentially by a future ASCollectionView. Observes the visible range, maintains - * a working range, and is responsible for handling AsyncDisplayKit machinery (sizing cell nodes,x enqueueing and + * a working range, and is responsible for handling AsyncDisplayKit machinery (sizing cell nodes, enqueueing and * cancelling their asynchronous layout and display, and so on). */ @interface ASRangeController : ASDealloc2MainObject diff --git a/AsyncDisplayKit/Details/ASRangeController.mm b/AsyncDisplayKit/Details/ASRangeController.mm index ea6695d9b2..a79e27f67e 100644 --- a/AsyncDisplayKit/Details/ASRangeController.mm +++ b/AsyncDisplayKit/Details/ASRangeController.mm @@ -12,15 +12,15 @@ #import "ASDisplayNodeExtras.h" #import "ASDisplayNodeInternal.h" #import "ASMultiDimensionalArrayUtils.h" -#import "ASRenderRangeDelegate.h" -#import "ASPreloadRangeDelegate.h" +#import "ASRangeHandlerRender.h" +#import "ASRangeHandlerPreload.h" @interface ASRangeController () { BOOL _rangeIsValid; // keys should be ASLayoutRangeTypes and values NSSets containing NSIndexPaths NSMutableDictionary *_rangeTypeIndexPaths; - NSDictionary *_rangeTypeDelegates; + NSDictionary *_rangeTypeHandlers; BOOL _queuedRangeUpdate; ASScrollDirection _scrollDirection; @@ -36,9 +36,9 @@ _rangeIsValid = YES; _rangeTypeIndexPaths = [[NSMutableDictionary alloc] init]; - _rangeTypeDelegates = @{ - @(ASLayoutRangeTypeRender): [[ASRenderRangeDelegate alloc] init], - @(ASLayoutRangeTypePreload): [[ASPreloadRangeDelegate alloc] init], + _rangeTypeHandlers = @{ + @(ASLayoutRangeTypeRender): [[ASRangeHandlerRender alloc] init], + @(ASLayoutRangeTypePreload): [[ASRangeHandlerPreload alloc] init], }; } @@ -94,7 +94,7 @@ id rangeKey = @(rangeType); // this delegate decide what happens when a node is added or removed from a range - id rangeDelegate = _rangeTypeDelegates[rangeKey]; + id rangeDelegate = _rangeTypeHandlers[rangeKey]; if ([_layoutController shouldUpdateForVisibleIndexPaths:visibleNodePaths viewportSize:viewportSize rangeType:rangeType]) { NSSet *indexPaths = [_layoutController indexPathsForScrolling:_scrollDirection viewportSize:viewportSize rangeType:rangeType]; @@ -106,7 +106,9 @@ if (removedIndexPaths.count) { NSArray *removedNodes = [_delegate rangeController:self nodesAtIndexPaths:[removedIndexPaths allObjects]]; [removedNodes enumerateObjectsUsingBlock:^(ASCellNode *node, NSUInteger idx, BOOL *stop) { - [rangeDelegate node:node exitedRangeType:rangeType]; + // since this class usually manages large or infinite data sets, the working range + // directly bounds memory usage by requiring redrawing any content that falls outside the range. + [rangeDelegate node:node exitedRangeOfType:rangeType]; }]; } @@ -115,14 +117,15 @@ [addedIndexPaths minusSet:[_rangeTypeIndexPaths objectForKey:rangeKey]]; // The preload range (for example) should include nodes that are visible - if ([self shouldRemoveVisibleNodesFromRangeType:rangeType]) { + // TODO: remove this once we have removed the dependency on Core Animation's -display + if ([self shouldSkipVisibleNodesForRangeType:rangeType]) { [addedIndexPaths minusSet:visibleNodePathsSet]; } if (addedIndexPaths.count) { NSArray *addedNodes = [_delegate rangeController:self nodesAtIndexPaths:[addedIndexPaths allObjects]]; [addedNodes enumerateObjectsUsingBlock:^(ASCellNode *node, NSUInteger idx, BOOL *stop) { - [rangeDelegate node:node enteredRangeType:rangeType]; + [rangeDelegate node:node enteredRangeOfType:rangeType]; }]; } @@ -135,9 +138,9 @@ _queuedRangeUpdate = NO; } -- (BOOL)shouldRemoveVisibleNodesFromRangeType:(ASLayoutRangeType)rangeType +- (BOOL)shouldSkipVisibleNodesForRangeType:(ASLayoutRangeType)rangeType { - return rangeType != ASLayoutRangeTypePreload; + return rangeType == ASLayoutRangeTypeRender; } - (void)configureContentView:(UIView *)contentView forCellNode:(ASCellNode *)cellNode diff --git a/AsyncDisplayKit/Details/ASRangeDelegate.h b/AsyncDisplayKit/Details/ASRangeHandler.h similarity index 67% rename from AsyncDisplayKit/Details/ASRangeDelegate.h rename to AsyncDisplayKit/Details/ASRangeHandler.h index 404f973bd6..22a7c564a5 100644 --- a/AsyncDisplayKit/Details/ASRangeDelegate.h +++ b/AsyncDisplayKit/Details/ASRangeHandler.h @@ -12,11 +12,11 @@ @class ASDisplayNode; -@protocol ASRangeDelegate +@protocol ASRangeHandler @required -- (void)node:(ASDisplayNode *)node enteredRangeType:(ASLayoutRangeType)rangeType; -- (void)node:(ASDisplayNode *)node exitedRangeType:(ASLayoutRangeType)rangeType; +- (void)node:(ASDisplayNode *)node enteredRangeOfType:(ASLayoutRangeType)rangeType; +- (void)node:(ASDisplayNode *)node exitedRangeOfType:(ASLayoutRangeType)rangeType; @end diff --git a/AsyncDisplayKit/Details/ASPreloadRangeDelegate.h b/AsyncDisplayKit/Details/ASRangeHandlerPreload.h similarity index 76% rename from AsyncDisplayKit/Details/ASPreloadRangeDelegate.h rename to AsyncDisplayKit/Details/ASRangeHandlerPreload.h index 672c854d97..7dc0113883 100644 --- a/AsyncDisplayKit/Details/ASPreloadRangeDelegate.h +++ b/AsyncDisplayKit/Details/ASRangeHandlerPreload.h @@ -8,8 +8,8 @@ #import -#import +#import -@interface ASPreloadRangeDelegate : NSObject +@interface ASRangeHandlerPreload : NSObject @end diff --git a/AsyncDisplayKit/Details/ASRangeHandlerPreload.mm b/AsyncDisplayKit/Details/ASRangeHandlerPreload.mm new file mode 100644 index 0000000000..21f1bf16dc --- /dev/null +++ b/AsyncDisplayKit/Details/ASRangeHandlerPreload.mm @@ -0,0 +1,28 @@ +/* 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. + */ + +#import "ASRangeHandlerPreload.h" + +#import "ASDisplayNode.h" +#import "ASDisplayNode+Subclasses.h" + +@implementation ASRangeHandlerPreload + +- (void)node:(ASDisplayNode *)node enteredRangeOfType:(ASLayoutRangeType)rangeType +{ + ASDisplayNodeAssert(rangeType == ASLayoutRangeTypePreload, @"Preload delegate should not handle other ranges"); + [node fetchRemoteData]; +} + +- (void)node:(ASDisplayNode *)node exitedRangeOfType:(ASLayoutRangeType)rangeType +{ + ASDisplayNodeAssert(rangeType == ASLayoutRangeTypePreload, @"Preload delegate should not handle other ranges"); + [node clearRemoteData]; +} + +@end diff --git a/AsyncDisplayKit/Details/ASRenderRangeDelegate.h b/AsyncDisplayKit/Details/ASRangeHandlerRender.h similarity index 77% rename from AsyncDisplayKit/Details/ASRenderRangeDelegate.h rename to AsyncDisplayKit/Details/ASRangeHandlerRender.h index fbea7f1d97..b064cb6abf 100644 --- a/AsyncDisplayKit/Details/ASRenderRangeDelegate.h +++ b/AsyncDisplayKit/Details/ASRangeHandlerRender.h @@ -8,8 +8,8 @@ #import -#import +#import -@interface ASRenderRangeDelegate : NSObject +@interface ASRangeHandlerRender : NSObject @end diff --git a/AsyncDisplayKit/Details/ASRenderRangeDelegate.mm b/AsyncDisplayKit/Details/ASRangeHandlerRender.mm similarity index 70% rename from AsyncDisplayKit/Details/ASRenderRangeDelegate.mm rename to AsyncDisplayKit/Details/ASRangeHandlerRender.mm index b02125ab7f..075535fc26 100644 --- a/AsyncDisplayKit/Details/ASRenderRangeDelegate.mm +++ b/AsyncDisplayKit/Details/ASRangeHandlerRender.mm @@ -6,20 +6,20 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "ASRenderRangeDelegate.h" +#import "ASRangeHandlerRender.h" #import "ASDisplayNode.h" #import "ASDisplayNode+Subclasses.h" #import "ASDisplayNodeInternal.h" -@interface ASDisplayNode (ASRenderRangeDelegate) +@interface ASDisplayNode (ASRangeHandlerRender) - (void)display; - (void)recursivelyDisplay; @end -@implementation ASDisplayNode (ASRenderRangeDelegate) +@implementation ASDisplayNode (ASRangeHandlerRender) - (void)display { @@ -59,12 +59,12 @@ @end -@implementation ASRenderRangeDelegate +@implementation ASRangeHandlerRender -- (void)node:(ASDisplayNode *)node enteredRangeType:(ASLayoutRangeType)rangeType +- (void)node:(ASDisplayNode *)node enteredRangeOfType:(ASLayoutRangeType)rangeType { ASDisplayNodeAssertMainThread(); - ASDisplayNodeAssert(node, @"invalid argument"); + ASDisplayNodeAssert(rangeType == ASLayoutRangeTypeRender, @"Render delegate should not handle other ranges"); // if node is in the working range it should not actively be in view [node.view removeFromSuperview]; @@ -72,16 +72,14 @@ [node recursivelyDisplay]; } -- (void)node:(ASDisplayNode *)node exitedRangeType:(ASLayoutRangeType)rangeType +- (void)node:(ASDisplayNode *)node exitedRangeOfType:(ASLayoutRangeType)rangeType { ASDisplayNodeAssertMainThread(); - ASDisplayNodeAssert(node, @"invalid argument"); + ASDisplayNodeAssert(rangeType == ASLayoutRangeTypeRender, @"Render delegate should not handle other ranges"); [node recursivelySetDisplaySuspended:YES]; [node.view removeFromSuperview]; - // since this class usually manages large or infinite data sets, the working range - // directly bounds memory usage by requiring redrawing any content that falls outside the range. [node recursivelyClearRendering]; }