Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Summary: It's time to ship the new updater! `IGListExperimentalAdapterUpdater` has been running on Instagram for a couple months with better performance and stability. In this diff, we're renaming `IGListExperimentalAdapterUpdater` (and related classes) to `IGListAdapterUpdater`. Here's a recap: ## Stability * `[IGListAdapter setDataSource]` isn't safe * We're changing the underlying data without telling the `UICollectionView`. * Fix: Lets invalidate the `UICollectionView` data by changing its dataSource. * `[IGListAdapter setCollectionView]` isn't safe * This is synchronous, but we might have pending or on-going updates. The `UICollectionView` might get synced before the pending update actually start executing, so the diff results will be off. * Fix: Lets wrap updates in a transaction that can be cancelled. * Returning a nil `IGListSectionController` from `IGListAdapterDataSource` could crash * The `IGListAdapterUpdater` will still perform the diffing assuming that all the objects will have a section, which isn't the case. * Fix: Lets generate the `IGListSectionController` before the diffing. * Other improvements * Lets ask for the `fromObject` just before diffing, instead of asking when scheduling the update. * If the `UICollectionView` section count doesn't match `fromObject`, lets fallback to a reload. ## Performance * Re-test background diffing * `IGListExperimentBackgroundDiffing` and coalescing updates wasn't safe because of the issues mentioned above. The longer we wait, the more likely we'll end up in a race condition. Lets try re-testing with the stability improvements. * Unblocks background layout calculation * This is a larger project, but these improvements are required to make background work safe. * Only create the `backgroundView` if needed (although this doesn't really require the new updater) ## Other * Transactions * `IGListAdapterUpdater` is the workhorse of `IGListKit` and has become a bit hard to follow over the years. We want to break it apart into simpler, more manageable parts. * Avoid blocks * There's a lot of blocks flying around, making crash logs hard to read. Lets try to use methods/functions where possible. Reviewed By: Haud, lorixx Differential Revision: D25884782 fbshipit-source-id: 1357fa23513a239051d5b1766823effa3199f656
- Loading branch information