2019-12-19 17:32:49 +00:00
|
|
|
/*
|
2023-04-06 09:44:16 +00:00
|
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
2016-09-07 22:37:59 +00:00
|
|
|
*
|
2018-05-01 21:33:50 +00:00
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
|
|
* LICENSE file in the root directory of this source tree.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
|
|
|
|
|
2016-12-14 07:01:21 +00:00
|
|
|
#import <Foundation/Foundation.h>
|
2016-09-07 22:37:59 +00:00
|
|
|
|
2021-09-01 02:22:18 +00:00
|
|
|
#import "IGListMacros.h"
|
|
|
|
|
#import "IGListMoveIndex.h"
|
|
|
|
|
#import "IGListMoveIndexPath.h"
|
2016-09-07 22:37:59 +00:00
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
/**
|
2019-12-19 17:32:49 +00:00
|
|
|
An instance of `IGListBatchUpdateData` takes section indexes and item index paths
|
2016-11-15 19:32:54 +00:00
|
|
|
and performs cleanup on init in order to perform a crash-free
|
|
|
|
|
update via `-[UICollectionView performBatchUpdates:completion:]`.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
|
|
|
|
IGLK_SUBCLASSING_RESTRICTED
|
Swift name annotations
Summary:
This adds `NS_SWIFT_NAME` annotations to all public API's to provide cleaner integration into Swift:
- Removes the need to prefix classes in Swift code, instead rely on Swift module name spacing
- Adds more argument labels to C function API's like `IGListDiff([], [], .equality)` => `ListDiff(oldArray: [], newArray: [], option: .equality)`
While this is a large API change it should be as easy as:
- Find and replace `(IGList)([^K])` to `List$2` in Xcode with a scope set to Swift
- Build and follow compiler's auto fix corrections for C API's or any missed renames
I have not updated the documentation to reflect this yet, I am totally willing to do so but before I sink that amount of time into it I wanted to see if the Instagram team is even open to this change!
- [x] All tests pass. Demo project builds and runs.
- [x] I added tests, an experiment, or detailed why my change isn't tested.
- [x] I added an entry to the `CHANGELOG.md` for any breaking changes, enhancements, or bug fixes.
- [x] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md)
- [ ] I have updated the documentation
Closes https://github.com/Instagram/IGListKit/pull/593
Reviewed By: jessesquires
Differential Revision: D5028039
Pulled By: rnystrom
fbshipit-source-id: b473d874a1f9574e56b2ebaabd5b73d1b57d4bab
2017-05-09 21:29:52 +00:00
|
|
|
NS_SWIFT_NAME(ListBatchUpdateData)
|
2016-09-07 22:37:59 +00:00
|
|
|
@interface IGListBatchUpdateData : NSObject
|
|
|
|
|
|
|
|
|
|
/**
|
2016-11-15 19:32:54 +00:00
|
|
|
Section insert indexes.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
|
|
|
|
@property (nonatomic, strong, readonly) NSIndexSet *insertSections;
|
|
|
|
|
|
|
|
|
|
/**
|
2016-11-15 19:32:54 +00:00
|
|
|
Section delete indexes.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
|
|
|
|
@property (nonatomic, strong, readonly) NSIndexSet *deleteSections;
|
|
|
|
|
|
|
|
|
|
/**
|
2017-02-11 01:52:35 +00:00
|
|
|
Section moves.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
|
|
|
|
@property (nonatomic, strong, readonly) NSSet<IGListMoveIndex *> *moveSections;
|
|
|
|
|
|
|
|
|
|
/**
|
2016-11-15 19:32:54 +00:00
|
|
|
Item insert index paths.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
2017-04-11 21:35:31 +00:00
|
|
|
@property (nonatomic, strong, readonly) NSArray<NSIndexPath *> *insertIndexPaths;
|
2016-09-07 22:37:59 +00:00
|
|
|
|
|
|
|
|
/**
|
2016-11-15 19:32:54 +00:00
|
|
|
Item delete index paths.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
2017-04-11 21:35:31 +00:00
|
|
|
@property (nonatomic, strong, readonly) NSArray<NSIndexPath *> *deleteIndexPaths;
|
2016-09-07 22:37:59 +00:00
|
|
|
|
Add option to update cells instead of delete+insert for section reload
Summary:
We have seen unnecessary flashiness updates for any section reload updates.
Basically we have 1 section for 1 cell, which is recommended by the IGListKit document in https://instagram.github.io/IGListKit/best-practices-and-faq.html, specifically:
> "We highly recommend using single-item sections when possible."
However, the issue is that whenever we update the underlying data model, we would trigger a delete+insert for the section reload.
In order to mitigate that, we can fix this delete+insert changes or we use the `IGListBindingSectionController`, however, the latter one requires more refactoring plus view model wrapper to have `isEqualToDifferable:` to return YES, which seems less than ideal.
I am proposing that we add an option to the `IGListAdapterUpdater`, as `preferItemReloadsForSectionReloads` so that when it's set to YES, we would trigger the proper `-[UICollectionView reloadItemsAtIndexPaths:]` which handles the cell update properly.
This option also handles the case where the number of items in the section is changed before and after the updates, in that case, it will fallback to do the "delete+insert" section operation.
Reviewed By: rnystrom
Differential Revision: D9519519
fbshipit-source-id: 22ecca07679ebdd212cf771c61e40887cb6a9ba8
2018-08-29 06:22:13 +00:00
|
|
|
/**
|
|
|
|
|
Item update index paths.
|
|
|
|
|
*/
|
|
|
|
|
@property (nonatomic, strong, readonly) NSArray<NSIndexPath *> *updateIndexPaths;
|
|
|
|
|
|
2017-02-11 01:52:35 +00:00
|
|
|
/**
|
|
|
|
|
Item moves.
|
|
|
|
|
*/
|
2017-04-11 21:35:31 +00:00
|
|
|
@property (nonatomic, strong, readonly) NSArray<IGListMoveIndexPath *> *moveIndexPaths;
|
2017-02-11 01:52:35 +00:00
|
|
|
|
2016-09-07 22:37:59 +00:00
|
|
|
/**
|
2016-11-15 19:32:54 +00:00
|
|
|
Creates a new batch update object with section and item operations.
|
2016-09-07 22:37:59 +00:00
|
|
|
|
2017-04-18 16:30:53 +00:00
|
|
|
@param insertSections Section indexes to insert.
|
|
|
|
|
@param deleteSections Section indexes to delete.
|
|
|
|
|
@param moveSections Section moves.
|
2016-09-07 22:37:59 +00:00
|
|
|
@param insertIndexPaths Item index paths to insert.
|
|
|
|
|
@param deleteIndexPaths Item index paths to delete.
|
Add option to update cells instead of delete+insert for section reload
Summary:
We have seen unnecessary flashiness updates for any section reload updates.
Basically we have 1 section for 1 cell, which is recommended by the IGListKit document in https://instagram.github.io/IGListKit/best-practices-and-faq.html, specifically:
> "We highly recommend using single-item sections when possible."
However, the issue is that whenever we update the underlying data model, we would trigger a delete+insert for the section reload.
In order to mitigate that, we can fix this delete+insert changes or we use the `IGListBindingSectionController`, however, the latter one requires more refactoring plus view model wrapper to have `isEqualToDifferable:` to return YES, which seems less than ideal.
I am proposing that we add an option to the `IGListAdapterUpdater`, as `preferItemReloadsForSectionReloads` so that when it's set to YES, we would trigger the proper `-[UICollectionView reloadItemsAtIndexPaths:]` which handles the cell update properly.
This option also handles the case where the number of items in the section is changed before and after the updates, in that case, it will fallback to do the "delete+insert" section operation.
Reviewed By: rnystrom
Differential Revision: D9519519
fbshipit-source-id: 22ecca07679ebdd212cf771c61e40887cb6a9ba8
2018-08-29 06:22:13 +00:00
|
|
|
@param updateIndexPaths Item index paths to update.
|
2017-04-18 16:30:53 +00:00
|
|
|
@param moveIndexPaths Item index paths to move.
|
2024-12-12 12:02:03 +00:00
|
|
|
|
2016-09-07 22:37:59 +00:00
|
|
|
|
2016-11-15 19:32:54 +00:00
|
|
|
@return A new batch update object.
|
2016-09-07 22:37:59 +00:00
|
|
|
*/
|
|
|
|
|
- (instancetype)initWithInsertSections:(NSIndexSet *)insertSections
|
|
|
|
|
deleteSections:(NSIndexSet *)deleteSections
|
|
|
|
|
moveSections:(NSSet<IGListMoveIndex *> *)moveSections
|
2017-04-11 21:35:31 +00:00
|
|
|
insertIndexPaths:(NSArray<NSIndexPath *> *)insertIndexPaths
|
|
|
|
|
deleteIndexPaths:(NSArray<NSIndexPath *> *)deleteIndexPaths
|
Add option to update cells instead of delete+insert for section reload
Summary:
We have seen unnecessary flashiness updates for any section reload updates.
Basically we have 1 section for 1 cell, which is recommended by the IGListKit document in https://instagram.github.io/IGListKit/best-practices-and-faq.html, specifically:
> "We highly recommend using single-item sections when possible."
However, the issue is that whenever we update the underlying data model, we would trigger a delete+insert for the section reload.
In order to mitigate that, we can fix this delete+insert changes or we use the `IGListBindingSectionController`, however, the latter one requires more refactoring plus view model wrapper to have `isEqualToDifferable:` to return YES, which seems less than ideal.
I am proposing that we add an option to the `IGListAdapterUpdater`, as `preferItemReloadsForSectionReloads` so that when it's set to YES, we would trigger the proper `-[UICollectionView reloadItemsAtIndexPaths:]` which handles the cell update properly.
This option also handles the case where the number of items in the section is changed before and after the updates, in that case, it will fallback to do the "delete+insert" section operation.
Reviewed By: rnystrom
Differential Revision: D9519519
fbshipit-source-id: 22ecca07679ebdd212cf771c61e40887cb6a9ba8
2018-08-29 06:22:13 +00:00
|
|
|
updateIndexPaths:(NSArray<NSIndexPath *> *)updateIndexPaths
|
2024-12-12 12:02:03 +00:00
|
|
|
moveIndexPaths:(NSArray<IGListMoveIndexPath *> *)moveIndexPaths NS_DESIGNATED_INITIALIZER;
|
2016-09-07 22:37:59 +00:00
|
|
|
|
2016-11-15 19:32:54 +00:00
|
|
|
/**
|
|
|
|
|
:nodoc:
|
|
|
|
|
*/
|
2016-09-07 22:37:59 +00:00
|
|
|
- (instancetype)init NS_UNAVAILABLE;
|
2016-11-15 19:32:54 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
:nodoc:
|
|
|
|
|
*/
|
2016-09-07 22:37:59 +00:00
|
|
|
+ (instancetype)new NS_UNAVAILABLE;
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_END
|