From a05d3119adc8a97b66b76ea86e3f8d65135f9d5d Mon Sep 17 00:00:00 2001 From: Nick Velloff Date: Wed, 22 Jun 2016 16:21:10 -0700 Subject: [PATCH] [WIP] Trigger new batch fetch for collection view after layout transitions (#1697) [Table / Collection] Trigger new batch fetch after programmatic scrolls, or layout transitions. --- AsyncDisplayKit/ASCollectionView.mm | 6 ++++++ AsyncDisplayKit/ASTableView.mm | 5 +++++ AsyncDisplayKit/Details/ASRangeController.h | 7 +++++++ AsyncDisplayKit/Details/ASRangeController.mm | 1 + 4 files changed, 19 insertions(+) diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index 821e21ddca..a7ab280e25 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -1002,6 +1002,7 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; - (NSArray *)visibleNodeIndexPathsForRangeController:(ASRangeController *)rangeController { ASDisplayNodeAssertMainThread(); + // Calling visibleNodeIndexPathsForRangeController: will trigger UIKit to call reloadData if it never has, which can result // in incorrect layout if performed at zero size. We can use the fact that nothing can be visible at zero size to return fast. BOOL isZeroSized = CGRectEqualToRect(self.bounds, CGRectZero); @@ -1065,6 +1066,11 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; _performingBatchUpdates = NO; } +- (void)didCompleteUpdatesInRangeController:(ASRangeController *)rangeController +{ + [self _checkForBatchFetching]; +} + - (void)rangeController:(ASRangeController *)rangeController didInsertNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions { ASDisplayNodeAssertMainThread(); diff --git a/AsyncDisplayKit/ASTableView.mm b/AsyncDisplayKit/ASTableView.mm index b8a174bbdd..871589b49d 100644 --- a/AsyncDisplayKit/ASTableView.mm +++ b/AsyncDisplayKit/ASTableView.mm @@ -968,6 +968,11 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell"; } } +- (void)didCompleteUpdatesInRangeController:(ASRangeController *)rangeController +{ + [self _checkForBatchFetching]; +} + - (void)rangeController:(ASRangeController *)rangeController didInsertNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions { ASDisplayNodeAssertMainThread(); diff --git a/AsyncDisplayKit/Details/ASRangeController.h b/AsyncDisplayKit/Details/ASRangeController.h index 2de7e3ce4f..c79124a961 100644 --- a/AsyncDisplayKit/Details/ASRangeController.h +++ b/AsyncDisplayKit/Details/ASRangeController.h @@ -146,6 +146,13 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)rangeController:(ASRangeController * )rangeController didEndUpdatesAnimated:(BOOL)animated completion:(void (^)(BOOL))completion; +/** + * Completed updates to cell node addition and removal. + * + * @param rangeController Sender. + */ +- (void)didCompleteUpdatesInRangeController:(ASRangeController *)rangeController; + /** * Called for nodes insertion. * diff --git a/AsyncDisplayKit/Details/ASRangeController.mm b/AsyncDisplayKit/Details/ASRangeController.mm index 436cb8f409..6c84935540 100644 --- a/AsyncDisplayKit/Details/ASRangeController.mm +++ b/AsyncDisplayKit/Details/ASRangeController.mm @@ -333,6 +333,7 @@ static UIApplicationState __ApplicationState = UIApplicationStateActive; [modifiedIndexPaths sortUsingSelector:@selector(compare:)]; NSLog(@"Range update complete; modifiedIndexPaths: %@", [self descriptionWithIndexPaths:modifiedIndexPaths]); #endif + [_delegate didCompleteUpdatesInRangeController:self]; } #pragma mark - Notification observers