From 01be5acece340f0391284347d0e507ae320f9b68 Mon Sep 17 00:00:00 2001 From: rcancro <@pinterest.com> Date: Mon, 14 Sep 2015 20:36:08 -0700 Subject: [PATCH 1/2] added a callback for initWithViewBlock/initWithLayerBlock --- AsyncDisplayKit/ASCellNode.m | 4 +- AsyncDisplayKit/ASDisplayNode.h | 33 +++++++++- AsyncDisplayKit/ASDisplayNode.mm | 61 +++++++++++++------ AsyncDisplayKit/ASEditableTextNode.mm | 4 +- AsyncDisplayKit/ASImageNode.mm | 4 +- AsyncDisplayKit/ASTextNode.mm | 4 +- .../Private/ASDisplayNodeInternal.h | 2 + 7 files changed, 85 insertions(+), 27 deletions(-) diff --git a/AsyncDisplayKit/ASCellNode.m b/AsyncDisplayKit/ASCellNode.m index 14b304086b..04543ff880 100644 --- a/AsyncDisplayKit/ASCellNode.m +++ b/AsyncDisplayKit/ASCellNode.m @@ -31,13 +31,13 @@ return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/ASDisplayNode.h b/AsyncDisplayKit/ASDisplayNode.h index 7fcfbd5999..ca6823317b 100644 --- a/AsyncDisplayKit/ASDisplayNode.h +++ b/AsyncDisplayKit/ASDisplayNode.h @@ -19,10 +19,19 @@ * UIView creation block. Used to create the backing view of a new display node. */ typedef UIView *(^ASDisplayNodeViewBlock)(); +/** + * UIView loaded callback block. Used for any additional setup to the view created by viewBlock. + */ +typedef void (^ASDisplayNodeViewLoadedBlock)(UIView *loadedView); + /** * CALayer creation block. Used to create the backing layer of a new display node. */ typedef CALayer *(^ASDisplayNodeLayerBlock)(); +/** + * CALayer loaded callback block. Used for any additional setup to the layer created by layerBlock. + */ +typedef void (^ASDisplayNodeLayerLoadedBlock)(CALayer *layer); /** * An `ASDisplayNode` is an abstraction over `UIView` and `CALayer` that allows you to perform calculations about a view @@ -65,6 +74,17 @@ typedef CALayer *(^ASDisplayNodeLayerBlock)(); */ - (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock; +/** + * @abstract Alternative initializer with a block to create the backing view. + * + * @param viewBlock The block that will be used to create the backing view. + * @param viewLoadedBlock The block that will be called after the view created by the viewBlock is loaded + * + * @return An ASDisplayNode instance that loads its view with the given block that is guaranteed to run on the main + * queue. The view will render synchronously and -layout and touch handling methods on the node will not be called. + */ +- (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock; + /** * @abstract Alternative initializer with a block to create the backing layer. * @@ -73,7 +93,18 @@ typedef CALayer *(^ASDisplayNodeLayerBlock)(); * @return An ASDisplayNode instance that loads its layer with the given block that is guaranteed to run on the main * queue. The layer will render synchronously and -layout and touch handling methods on the node will not be called. */ -- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock; +- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock; + +/** + * @abstract Alternative initializer with a block to create the backing layer. + * + * @param viewBlock The block that will be used to create the backing layer. + * @param layerLoadedBlock The block that will be called after the layer created by the layerBlock is loaded + * + * @return An ASDisplayNode instance that loads its layer with the given block that is guaranteed to run on the main + * queue. The layer will render synchronously and -layout and touch handling methods on the node will not be called. + */ +- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock; /** @name Properties */ diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 90aecd3865..5f9985802a 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -256,33 +256,47 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) - (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock { - if (!(self = [super init])) - return nil; - - ASDisplayNodeAssertNotNil(viewBlock, @"should initialize with a valid block that returns a UIView"); - - [self _initializeInstance]; - _viewBlock = viewBlock; - _flags.synchronous = YES; - - return self; + return [self initWithViewBlock:viewBlock viewDidLoadBlock:nil]; } -- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock +- (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock { if (!(self = [super init])) return nil; - - ASDisplayNodeAssertNotNil(layerBlock, @"should initialize with a valid block that returns a CALayer"); - + + ASDisplayNodeAssertNotNil(viewBlock, @"should initialize with a valid block that returns a UIView"); + [self _initializeInstance]; - _layerBlock = layerBlock; + _viewBlock = viewBlock; + _viewLoadedBlock = viewLoadedBlock; _flags.synchronous = YES; - _flags.layerBacked = YES; - + return self; } + +- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock +{ + return [self initWithLayerBlock:layerBlock layerDidLoadBlock:nil]; +} + +- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock +{ + if (!(self = [super init])) + return nil; + + ASDisplayNodeAssertNotNil(layerBlock, @"should initialize with a valid block that returns a CALayer"); + + [self _initializeInstance]; + _layerBlock = layerBlock; + _layerLoadedBlock = layerLoadedBlock; + _flags.synchronous = YES; + _flags.layerBacked = YES; + + return self; +} + + - (void)dealloc { ASDisplayNodeAssertMainThread(); @@ -424,7 +438,7 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) } { TIME_SCOPED(_debugTimeForDidLoad); - [self didLoad]; + [self __didLoad]; } if (self.placeholderEnabled) { @@ -1482,6 +1496,17 @@ static NSInteger incrementIfFound(NSInteger i) { _flags.isMeasured = NO; } +- (void)__didLoad +{ + if (_viewLoadedBlock) { + _viewLoadedBlock(_view); + } + if (_layerLoadedBlock) { + _layerLoadedBlock(_layer); + } + [self didLoad]; +} + - (void)didLoad { ASDisplayNodeAssertMainThread(); diff --git a/AsyncDisplayKit/ASEditableTextNode.mm b/AsyncDisplayKit/ASEditableTextNode.mm index 37196fb2f7..51d2b040e3 100644 --- a/AsyncDisplayKit/ASEditableTextNode.mm +++ b/AsyncDisplayKit/ASEditableTextNode.mm @@ -86,13 +86,13 @@ return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/ASImageNode.mm b/AsyncDisplayKit/ASImageNode.mm index cf90d2f7fa..09167073e8 100644 --- a/AsyncDisplayKit/ASImageNode.mm +++ b/AsyncDisplayKit/ASImageNode.mm @@ -96,13 +96,13 @@ return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index 68f4f1fdab..85059a35f5 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -149,13 +149,13 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f) return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h index 2ea1960290..e4abd526b8 100644 --- a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h +++ b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h @@ -59,7 +59,9 @@ typedef NS_OPTIONS(NSUInteger, ASDisplayNodeMethodOverrides) { NSMutableArray *_subnodes; ASDisplayNodeViewBlock _viewBlock; + ASDisplayNodeViewLoadedBlock _viewLoadedBlock; ASDisplayNodeLayerBlock _layerBlock; + ASDisplayNodeLayerLoadedBlock _layerLoadedBlock; Class _viewClass; Class _layerClass; UIView *_view; From 2f3562fa090e020253611cbf2d5899b0ecbf0130 Mon Sep 17 00:00:00 2001 From: rcancro <@pinterest.com> Date: Tue, 15 Sep 2015 09:11:19 -0700 Subject: [PATCH 2/2] scott's comments --- AsyncDisplayKit/ASCellNode.m | 4 ++-- AsyncDisplayKit/ASDisplayNode.h | 19 +++++++++--------- AsyncDisplayKit/ASDisplayNode.mm | 20 +++++++++---------- AsyncDisplayKit/ASEditableTextNode.mm | 4 ++-- AsyncDisplayKit/ASImageNode.mm | 4 ++-- AsyncDisplayKit/ASTextNode.mm | 4 ++-- .../Private/ASDisplayNodeInternal.h | 3 +-- 7 files changed, 27 insertions(+), 31 deletions(-) diff --git a/AsyncDisplayKit/ASCellNode.m b/AsyncDisplayKit/ASCellNode.m index 04543ff880..80bc34598c 100644 --- a/AsyncDisplayKit/ASCellNode.m +++ b/AsyncDisplayKit/ASCellNode.m @@ -31,13 +31,13 @@ return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/ASDisplayNode.h b/AsyncDisplayKit/ASDisplayNode.h index ca6823317b..f8a346bd9a 100644 --- a/AsyncDisplayKit/ASDisplayNode.h +++ b/AsyncDisplayKit/ASDisplayNode.h @@ -15,23 +15,22 @@ #import +@class ASDisplayNode; + /** * UIView creation block. Used to create the backing view of a new display node. */ typedef UIView *(^ASDisplayNodeViewBlock)(); -/** - * UIView loaded callback block. Used for any additional setup to the view created by viewBlock. - */ -typedef void (^ASDisplayNodeViewLoadedBlock)(UIView *loadedView); /** * CALayer creation block. Used to create the backing layer of a new display node. */ typedef CALayer *(^ASDisplayNodeLayerBlock)(); + /** - * CALayer loaded callback block. Used for any additional setup to the layer created by layerBlock. + * ASDisplayNode loaded callback block. Used for any additional setup after node's layer/view has been loaded */ -typedef void (^ASDisplayNodeLayerLoadedBlock)(CALayer *layer); +typedef void (^ASDisplayNodeDidLoadBlock)(ASDisplayNode *node); /** * An `ASDisplayNode` is an abstraction over `UIView` and `CALayer` that allows you to perform calculations about a view @@ -78,12 +77,12 @@ typedef void (^ASDisplayNodeLayerLoadedBlock)(CALayer *layer); * @abstract Alternative initializer with a block to create the backing view. * * @param viewBlock The block that will be used to create the backing view. - * @param viewLoadedBlock The block that will be called after the view created by the viewBlock is loaded + * @param didLoadBlock The block that will be called after the view created by the viewBlock is loaded * * @return An ASDisplayNode instance that loads its view with the given block that is guaranteed to run on the main * queue. The view will render synchronously and -layout and touch handling methods on the node will not be called. */ -- (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock; +- (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock; /** * @abstract Alternative initializer with a block to create the backing layer. @@ -99,12 +98,12 @@ typedef void (^ASDisplayNodeLayerLoadedBlock)(CALayer *layer); * @abstract Alternative initializer with a block to create the backing layer. * * @param viewBlock The block that will be used to create the backing layer. - * @param layerLoadedBlock The block that will be called after the layer created by the layerBlock is loaded + * @param didLoadBlock The block that will be called after the layer created by the layerBlock is loaded * * @return An ASDisplayNode instance that loads its layer with the given block that is guaranteed to run on the main * queue. The layer will render synchronously and -layout and touch handling methods on the node will not be called. */ -- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock; +- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock; /** @name Properties */ diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 5f9985802a..323ade43e5 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -256,10 +256,10 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) - (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock { - return [self initWithViewBlock:viewBlock viewDidLoadBlock:nil]; + return [self initWithViewBlock:viewBlock didLoadBlock:nil]; } -- (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock +- (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { if (!(self = [super init])) return nil; @@ -268,7 +268,7 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) [self _initializeInstance]; _viewBlock = viewBlock; - _viewLoadedBlock = viewLoadedBlock; + _nodeLoadedBlock = didLoadBlock; _flags.synchronous = YES; return self; @@ -277,10 +277,10 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) - (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock { - return [self initWithLayerBlock:layerBlock layerDidLoadBlock:nil]; + return [self initWithLayerBlock:layerBlock didLoadBlock:nil]; } -- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock +- (id)initWithLayerBlock:(ASDisplayNodeLayerBlock)layerBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { if (!(self = [super init])) return nil; @@ -289,7 +289,7 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) [self _initializeInstance]; _layerBlock = layerBlock; - _layerLoadedBlock = layerLoadedBlock; + _nodeLoadedBlock = didLoadBlock; _flags.synchronous = YES; _flags.layerBacked = YES; @@ -1498,11 +1498,9 @@ static NSInteger incrementIfFound(NSInteger i) { - (void)__didLoad { - if (_viewLoadedBlock) { - _viewLoadedBlock(_view); - } - if (_layerLoadedBlock) { - _layerLoadedBlock(_layer); + if (_nodeLoadedBlock) { + _nodeLoadedBlock(self); + _nodeLoadedBlock = nil; } [self didLoad]; } diff --git a/AsyncDisplayKit/ASEditableTextNode.mm b/AsyncDisplayKit/ASEditableTextNode.mm index 51d2b040e3..c2ecde2b95 100644 --- a/AsyncDisplayKit/ASEditableTextNode.mm +++ b/AsyncDisplayKit/ASEditableTextNode.mm @@ -86,13 +86,13 @@ return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/ASImageNode.mm b/AsyncDisplayKit/ASImageNode.mm index 09167073e8..dce8d0f076 100644 --- a/AsyncDisplayKit/ASImageNode.mm +++ b/AsyncDisplayKit/ASImageNode.mm @@ -96,13 +96,13 @@ return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index 85059a35f5..d688de0deb 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -149,13 +149,13 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f) return self; } -- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock layerDidLoadBlock:(ASDisplayNodeLayerLoadedBlock)layerLoadedBlock +- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; } -- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock viewDidLoadBlock:(ASDisplayNodeViewLoadedBlock)viewLoadedBlock +- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); return nil; diff --git a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h index e4abd526b8..7066159c68 100644 --- a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h +++ b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h @@ -59,9 +59,8 @@ typedef NS_OPTIONS(NSUInteger, ASDisplayNodeMethodOverrides) { NSMutableArray *_subnodes; ASDisplayNodeViewBlock _viewBlock; - ASDisplayNodeViewLoadedBlock _viewLoadedBlock; ASDisplayNodeLayerBlock _layerBlock; - ASDisplayNodeLayerLoadedBlock _layerLoadedBlock; + ASDisplayNodeDidLoadBlock _nodeLoadedBlock; Class _viewClass; Class _layerClass; UIView *_view;