Add experimental update coalescance feature and test

Summary:
Testing out new coalescence ideas after talking with @[100001606943892:tweilu]. Theory is that we can reduce stalls and improve scroll performance by batching more updates into one.

Need to test this out first.

Differential Revision: D7565003

fbshipit-source-id: b2e9fa39d52cc0b7aa59c2bfad709804ba0a0b63
This commit is contained in:
Ryan Nystrom 2018-04-10 13:39:47 -07:00 committed by Facebook Github Bot
parent e49c94b25d
commit 784f1beb9f
2 changed files with 7 additions and 5 deletions

View file

@ -49,6 +49,11 @@ NS_SWIFT_NAME(ListAdapterUpdater)
*/
@property (nonatomic, assign) BOOL allowsBackgroundReloading;
/**
Time, in seconds, to wait and coalesce batch updates. Default is 0.
*/
@property (nonatomic, assign) NSTimeInterval coalescanceTime;
/**
A bitmask of experiments to conduct on the updater.
*/

View file

@ -369,11 +369,8 @@ void convertReloadToDeleteInsert(NSMutableIndexSet *reloads,
__weak __typeof__(self) weakSelf = self;
__weak __typeof__(collectionView) weakCollectionView = collectionView;
// dispatch_async to give the main queue time to collect more batch updates so that a minimum amount of work
// (diffing, etc) is done on main. dispatch_async does not garauntee a full runloop turn will pass though.
// see -performUpdateWithCollectionView:fromObjects:toObjects:animated:]objectTransitionBlock:completion: for more
// details on how coalescence is done.
dispatch_async(dispatch_get_main_queue(), ^{
// dispatch after a given amount of time to coalesce other updates and execute as one
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, self.coalescanceTime * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
if (weakSelf.state != IGListBatchUpdateStateIdle
|| ![weakSelf hasChanges]) {
return;