From 56c6bd681b7fb1ebed62de1ea2b46bfa96a32efd Mon Sep 17 00:00:00 2001 From: Huy Nguyen Date: Tue, 26 Jan 2016 12:05:02 -0800 Subject: [PATCH] Revert "Revert commit 83aaa46, thus bring 2e4d716 back" This reverts commit 209425c22ce84ecbb7ab631753ec8fc34dd9cbb0. --- AsyncDisplayKit/ASCollectionView.mm | 23 +-- AsyncDisplayKit/ASTableView.mm | 20 +-- AsyncDisplayKit/Details/ASDataController.h | 9 +- AsyncDisplayKit/Details/ASDataController.mm | 133 ++++-------------- AsyncDisplayKit/Details/ASRangeController.h | 7 - AsyncDisplayKit/Details/ASRangeController.mm | 13 -- .../Details/ASRangeControllerBeta.mm | 8 -- 7 files changed, 35 insertions(+), 178 deletions(-) diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index 4334ee5d70..2b588d088b 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -250,7 +250,7 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; _superIsPendingDataLoad = YES; [super reloadData]; }); - [_dataController reloadDataWithCompletion:completion]; + [_dataController reloadDataWithAnimationOptions:kASCollectionViewAnimationNone completion:completion]; } - (void)reloadData @@ -262,7 +262,7 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; { ASDisplayNodeAssertMainThread(); _superIsPendingDataLoad = YES; - [_dataController reloadDataImmediately]; + [_dataController reloadDataImmediatelyWithAnimationOptions:kASCollectionViewAnimationNone]; [super reloadData]; } @@ -938,25 +938,6 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; } } -- (void)rangeControllerDidReloadData:(ASRangeController *)rangeController -{ - ASDisplayNodeAssertMainThread(); - - if (!self.asyncDataSource || _superIsPendingDataLoad) { - return; // if the asyncDataSource has become invalid while we are processing, ignore this request to avoid crashes - } - - if (_performingBatchUpdates) { - [_batchUpdateBlocks addObject:^{ - [super reloadData]; - }]; - } else { - [UIView performWithoutAnimation:^{ - [super reloadData]; - }]; - } -} - #pragma mark - ASCellNodeDelegate - (void)nodeDidRelayout:(ASCellNode *)node sizeChanged:(BOOL)sizeChanged diff --git a/AsyncDisplayKit/ASTableView.mm b/AsyncDisplayKit/ASTableView.mm index 26248fb8b6..6d5c40e807 100644 --- a/AsyncDisplayKit/ASTableView.mm +++ b/AsyncDisplayKit/ASTableView.mm @@ -298,7 +298,10 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell"; - (void)reloadDataWithCompletion:(void (^)())completion { - [_dataController reloadDataWithCompletion:completion]; + ASPerformBlockOnMainThread(^{ + [super reloadData]; + }); + [_dataController reloadDataWithAnimationOptions:UITableViewRowAnimationNone completion:completion]; } - (void)reloadData @@ -309,7 +312,8 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell"; - (void)reloadDataImmediately { ASDisplayNodeAssertMainThread(); - [_dataController reloadDataImmediately]; + [_dataController reloadDataImmediatelyWithAnimationOptions:UITableViewRowAnimationNone]; + [super reloadData]; } - (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType @@ -841,18 +845,6 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell"; }); } -- (void)rangeControllerDidReloadData:(ASRangeController *)rangeController -{ - ASDisplayNodeAssertMainThread(); - LOG(@"UITableView reloadData"); - - if (!self.asyncDataSource) { - return; // if the asyncDataSource has become invalid while we are processing, ignore this request to avoid crashes - } - - [super reloadData]; -} - #pragma mark - ASDataControllerDelegate - (ASCellNode *)dataController:(ASDataController *)dataController nodeAtIndexPath:(NSIndexPath *)indexPath diff --git a/AsyncDisplayKit/Details/ASDataController.h b/AsyncDisplayKit/Details/ASDataController.h index 113c582675..5710b22b4e 100644 --- a/AsyncDisplayKit/Details/ASDataController.h +++ b/AsyncDisplayKit/Details/ASDataController.h @@ -94,11 +94,6 @@ FOUNDATION_EXPORT NSString * const ASDataControllerRowNodeKind; */ - (void)dataController:(ASDataController *)dataController didDeleteSectionsAtIndexSet:(NSIndexSet *)indexSet withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions; -/** - Called for data reload. - */ -- (void)dataControllerDidReloadData:(ASDataController *)dataController; - @end /** @@ -175,9 +170,9 @@ FOUNDATION_EXPORT NSString * const ASDataControllerRowNodeKind; - (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions; -- (void)reloadDataWithCompletion:(void (^ _Nullable)())completion; +- (void)reloadDataWithAnimationOptions:(ASDataControllerAnimationOptions)animationOptions completion:(void (^ _Nullable)())completion; -- (void)reloadDataImmediately; +- (void)reloadDataImmediatelyWithAnimationOptions:(ASDataControllerAnimationOptions)animationOptions; /** @name Data Querying */ diff --git a/AsyncDisplayKit/Details/ASDataController.mm b/AsyncDisplayKit/Details/ASDataController.mm index 2b1549b651..53b3715874 100644 --- a/AsyncDisplayKit/Details/ASDataController.mm +++ b/AsyncDisplayKit/Details/ASDataController.mm @@ -43,7 +43,6 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; BOOL _delegateDidDeleteNodes; BOOL _delegateDidInsertSections; BOOL _delegateDidDeleteSections; - BOOL _delegateDidReloadData; } @property (atomic, assign) NSUInteger batchUpdateCounter; @@ -93,7 +92,6 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; _delegateDidDeleteNodes = [_delegate respondsToSelector:@selector(dataController:didDeleteNodes:atIndexPaths:withAnimationOptions:)]; _delegateDidInsertSections = [_delegate respondsToSelector:@selector(dataController:didInsertSections:atIndexSet:withAnimationOptions:)]; _delegateDidDeleteSections = [_delegate respondsToSelector:@selector(dataController:didDeleteSectionsAtIndexSet:withAnimationOptions:)]; - _delegateDidReloadData = [_delegate respondsToSelector:@selector(dataControllerDidReloadData:)]; } + (NSUInteger)parallelProcessorCount @@ -145,30 +143,14 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; node.frame = CGRectMake(0.0f, 0.0f, node.calculatedSize.width, node.calculatedSize.height); } -/** - * Measures and defines the layout for each node in optimized batches on an editing queue, inserting the results into the backing store. - */ -- (void)_batchLayoutNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths -{ - [self _batchLayoutNodes:nodes atIndexPaths:indexPaths andNotifyDelegate:NO withAnimationOptions:0]; -} - /** * Measures and defines the layout for each node in optimized batches on an editing queue, inserting the results into the backing store. */ - (void)_batchLayoutNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions -{ - [self _batchLayoutNodes:nodes atIndexPaths:indexPaths andNotifyDelegate:YES withAnimationOptions:animationOptions]; -} - -/** - * Measures and defines the layout for each node in optimized batches on an editing queue, inserting the results into the backing store. - */ -- (void)_batchLayoutNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths andNotifyDelegate:(BOOL)shouldNotifyDelegate withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions { [self batchLayoutNodes:nodes ofKind:ASDataControllerRowNodeKind atIndexPaths:indexPaths completion:^(NSArray *nodes, NSArray *indexPaths) { // Insert finished nodes into data storage - [self _insertNodes:nodes atIndexPaths:indexPaths andNotifyDelegate:shouldNotifyDelegate withAnimationOptions:animationOptions]; + [self _insertNodes:nodes atIndexPaths:indexPaths withAnimationOptions:animationOptions]; }]; } @@ -258,14 +240,6 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; }]; } -- (void)deleteAllNodesOfKind:(NSString *)kind -{ - [_editingNodes[kind] removeAllObjects]; - [_mainSerialQueue performBlockOnMainThread:^{ - [_completedNodes[kind] removeAllObjects]; - }]; -} - - (void)insertSections:(NSMutableArray *)sections ofKind:(NSString *)kind atIndexSet:(NSIndexSet *)indexSet completion:(void (^)(NSArray *sections, NSIndexSet *indexSet))completionBlock { if (indexSet.count == 0) @@ -303,17 +277,6 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; #pragma mark - Internal Data Querying + Editing -/** - * Inserts the specified nodes into the given index paths and doesn't notify the delegate of newly inserted nodes. - * - * @discussion Nodes are first inserted into the editing store, then the completed store is replaced by a deep copy - * of the editing nodes. - */ -- (void)_insertNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths -{ - [self _insertNodes:nodes atIndexPaths:indexPaths andNotifyDelegate:NO withAnimationOptions:0]; -} - /** * Inserts the specified nodes into the given index paths and notifies the delegate of newly inserted nodes. * @@ -322,26 +285,10 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; */ - (void)_insertNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions { - [self _insertNodes:nodes atIndexPaths:indexPaths andNotifyDelegate:YES withAnimationOptions:animationOptions]; -} - -/** - * Inserts the specified nodes into the given index paths and notifies the delegate of newly inserted nodes. - * - * @discussion Nodes are first inserted into the editing store, then the completed store is replaced by a deep copy - * of the editing nodes. The delegate is invoked on the main thread. - */ -- (void)_insertNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths andNotifyDelegate:(BOOL)shouldNotifyDelegate withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions -{ - void (^completionBlock)(NSArray *nodes, NSArray *indexPaths) = nil; - if (shouldNotifyDelegate) { - completionBlock = ^(NSArray *nodes, NSArray *indexPaths) { - if (_delegateDidInsertNodes) - [_delegate dataController:self didInsertNodes:nodes atIndexPaths:indexPaths withAnimationOptions:animationOptions]; - }; - } - - [self insertNodes:nodes ofKind:ASDataControllerRowNodeKind atIndexPaths:indexPaths completion:completionBlock]; + [self insertNodes:nodes ofKind:ASDataControllerRowNodeKind atIndexPaths:indexPaths completion:^(NSArray *nodes, NSArray *indexPaths) { + if (_delegateDidInsertNodes) + [_delegate dataController:self didInsertNodes:nodes atIndexPaths:indexPaths withAnimationOptions:animationOptions]; + }]; } /** @@ -358,46 +305,18 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; }]; } -/** - * Inserts sections, represented as arrays, into the backing store at the given indicies and doesn't notify the delegate. - * - * @discussion The section arrays are inserted into the editing store, then a deep copy of the sections are inserted - * in the completed store on the main thread. - */ -- (void)_insertSections:(NSMutableArray *)sections atIndexSet:(NSIndexSet *)indexSet -{ - [self _insertSections:sections atIndexSet:indexSet andNotifyDelegate:NO withAnimationOptions:0]; -} - -/** - * Inserts sections, represented as arrays, into the backing store at the given indicies and doesn't notify the delegate. - * - * @discussion The section arrays are inserted into the editing store, then a deep copy of the sections are inserted - * in the completed store on the main thread. - */ -- (void)_insertSections:(NSMutableArray *)sections atIndexSet:(NSIndexSet *)indexSet withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions -{ - [self _insertSections:sections atIndexSet:indexSet andNotifyDelegate:YES withAnimationOptions:animationOptions]; -} - /** * Inserts sections, represented as arrays, into the backing store at the given indicies and notifies the delegate. * * @discussion The section arrays are inserted into the editing store, then a deep copy of the sections are inserted * in the completed store on the main thread. The delegate is invoked on the main thread. */ -- (void)_insertSections:(NSMutableArray *)sections atIndexSet:(NSIndexSet *)indexSet andNotifyDelegate:(BOOL)shouldNotifyDelegate withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions +- (void)_insertSections:(NSMutableArray *)sections atIndexSet:(NSIndexSet *)indexSet withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions { - - void (^completionBlock)(NSArray *sections, NSIndexSet *indexSet) = nil; - if (shouldNotifyDelegate) { - completionBlock = ^(NSArray *sections, NSIndexSet *indexSet) { - if (_delegateDidInsertSections) - [_delegate dataController:self didInsertSections:sections atIndexSet:indexSet withAnimationOptions:animationOptions]; - }; - } - - [self insertSections:sections ofKind:ASDataControllerRowNodeKind atIndexSet:indexSet completion:completionBlock]; + [self insertSections:sections ofKind:ASDataControllerRowNodeKind atIndexSet:indexSet completion:^(NSArray *sections, NSIndexSet *indexSet) { + if (_delegateDidInsertSections) + [_delegate dataController:self didInsertSections:sections atIndexSet:indexSet withAnimationOptions:animationOptions]; + }]; } /** @@ -442,17 +361,17 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; }]; } -- (void)reloadDataWithCompletion:(void (^)())completion +- (void)reloadDataWithAnimationOptions:(ASDataControllerAnimationOptions)animationOptions completion:(void (^)())completion { - [self _reloadDataSynchronously:NO completion:completion]; + [self _reloadDataWithAnimationOptions:animationOptions synchronously:NO completion:completion]; } -- (void)reloadDataImmediately +- (void)reloadDataImmediatelyWithAnimationOptions:(ASDataControllerAnimationOptions)animationOptions { - [self _reloadDataSynchronously:YES completion:nil]; + [self _reloadDataWithAnimationOptions:animationOptions synchronously:YES completion:nil]; } -- (void)_reloadDataSynchronously:(BOOL)synchronously completion:(void (^)())completion +- (void)_reloadDataWithAnimationOptions:(ASDataControllerAnimationOptions)animationOptions synchronously:(BOOL)synchronously completion:(void (^)())completion { [self performEditCommandWithBlock:^{ ASDisplayNodeAssertMainThread(); @@ -474,7 +393,12 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; LOG(@"Edit Transaction - reloadData"); // Remove everything that existed before the reload, now that we're ready to insert replacements - [self deleteAllNodesOfKind:ASDataControllerRowNodeKind]; + NSArray *indexPaths = ASIndexPathsForMultidimensionalArray(_editingNodes[ASDataControllerRowNodeKind]); + [self _deleteNodesAtIndexPaths:indexPaths withAnimationOptions:animationOptions]; + + NSMutableArray *editingNodes = _editingNodes[ASDataControllerRowNodeKind]; + NSMutableIndexSet *indexSet = [[NSMutableIndexSet alloc] initWithIndexesInRange:NSMakeRange(0, editingNodes.count)]; + [self _deleteSectionsAtIndexSet:indexSet withAnimationOptions:animationOptions]; [self willReloadData]; @@ -484,19 +408,12 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; [sections addObject:[[NSMutableArray alloc] init]]; } - [self _insertSections:sections atIndexSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)]]; + [self _insertSections:sections atIndexSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)] withAnimationOptions:animationOptions]; - [self _batchLayoutNodes:updatedNodes atIndexPaths:updatedIndexPaths]; + [self _batchLayoutNodes:updatedNodes atIndexPaths:updatedIndexPaths withAnimationOptions:animationOptions]; - if (_delegateDidReloadData || completion) { - [_mainSerialQueue performBlockOnMainThread:^{ - if (_delegateDidReloadData) { - [_delegate dataControllerDidReloadData:self]; - } - if (completion) { - completion(); - } - }]; + if (completion) { + dispatch_async(dispatch_get_main_queue(), completion); } }; diff --git a/AsyncDisplayKit/Details/ASRangeController.h b/AsyncDisplayKit/Details/ASRangeController.h index 61ee2470ba..74061f8806 100644 --- a/AsyncDisplayKit/Details/ASRangeController.h +++ b/AsyncDisplayKit/Details/ASRangeController.h @@ -190,13 +190,6 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)rangeController:(ASRangeController *)rangeController didDeleteSectionsAtIndexSet:(NSIndexSet *)indexSet withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions; -/** - * Called for data reload. - * - * @param rangeController Sender. - */ -- (void)rangeControllerDidReloadData:(ASRangeController *)rangeController; - @end NS_ASSUME_NONNULL_END \ No newline at end of file diff --git a/AsyncDisplayKit/Details/ASRangeController.mm b/AsyncDisplayKit/Details/ASRangeController.mm index fa0610a0a4..0329ccfdf4 100644 --- a/AsyncDisplayKit/Details/ASRangeController.mm +++ b/AsyncDisplayKit/Details/ASRangeController.mm @@ -276,17 +276,4 @@ }); } -- (void)dataControllerDidReloadData:(ASDataController *)dataController -{ - ASPerformBlockOnMainThread(^{ - _rangeIsValid = NO; - - // When reload data we need to make sure that _rangeTypeIndexPaths is cleared as well, - // otherwise _updateVisibleNodeIndexPaths may try to retrieve nodes from dataSource that aren't there anymore - [_rangeTypeIndexPaths removeAllObjects]; - - [_delegate rangeControllerDidReloadData:self]; - }); -} - @end diff --git a/AsyncDisplayKit/Details/ASRangeControllerBeta.mm b/AsyncDisplayKit/Details/ASRangeControllerBeta.mm index ed4cd64b00..12627675a6 100644 --- a/AsyncDisplayKit/Details/ASRangeControllerBeta.mm +++ b/AsyncDisplayKit/Details/ASRangeControllerBeta.mm @@ -292,12 +292,4 @@ }); } -- (void)dataControllerDidReloadData:(ASDataController *)dataController -{ - ASPerformBlockOnMainThread(^{ - _rangeIsValid = NO; - [_delegate rangeControllerDidReloadData:self]; - }); -} - @end