diff --git a/Source/IGListAdapterUpdater.h b/Source/IGListAdapterUpdater.h index b772a95f..f4dc7016 100644 --- a/Source/IGListAdapterUpdater.h +++ b/Source/IGListAdapterUpdater.h @@ -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. */ diff --git a/Source/IGListAdapterUpdater.m b/Source/IGListAdapterUpdater.m index 6ec98a16..22f5a613 100644 --- a/Source/IGListAdapterUpdater.m +++ b/Source/IGListAdapterUpdater.m @@ -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;