Commit graph

318 commits

Author SHA1 Message Date
Nate Stedman
b7db8c5fe1 Use defined before checking macros in IGListKit
Summary: This allows us to potentially enable `-Wundef` in the future. Behavior is the same, undefined macros are false.

Differential Revision: D20906603

fbshipit-source-id: d5798861f0c9dfcd7a87936d575621d52c0ef7c7
2020-04-08 10:19:50 -07:00
Andy Wang
e437743e2b Properly animate reactions without jitter [IG Direct] [Reactions Emitter Animation] [7/x]
Summary: We add a boolean isDisplayingCell method to check the existence of displayingCell in IGListBindingSingleSectionController

Reviewed By: chritto

Differential Revision: D20649871

fbshipit-source-id: f626cfdedff907604514c485d11362cd9ba12b99
2020-03-27 13:53:58 -07:00
Maxime Ollivier
0f3fd694d3 add assert to avoid UICollectionView data inconsistencies
Summary:
A common cause of `NSInternalInconsistencyException` is when a section controller tries to access a cell or modify the `UICollectionView` in `-didUpdateToObject`. If the collection view doesn't have data yet, this will kick off the regular calls (ex: `-numberOfSectionsInCollectionView`, `-numberOfItemsInSection`), which won't have the right information yet because the `IGListAdpater` is in the middle of updating the object list. Eventually, this can lead to a crash, which are hard to debug because the callstack doesn't include the call that caused the premature update.

Lets add an assert to catch when this happens.

Reviewed By: candance

Differential Revision: D20527372

fbshipit-source-id: 4ad0b2d89e5b126d6ae888a5c3b1d980945b7a4c
2020-03-19 10:13:40 -07:00
Andy Wang
68e58bf60e Add fullyVisibleCellsForSectionController to IGListCollectionContext [IGListKit]
Reviewed By: chritto

Differential Revision: D20261859

fbshipit-source-id: 919132f935462c2a57270f0afaba511adc936995
2020-03-09 17:49:02 -07:00
Jordan Smith
403b7e7ba9 Roll out deffered [CATransaction commit] fix
Summary:
**Context**

Recently an IGListKit experiment was introduced, `IGListExperimentPerformUpdatesWithoutDeferringCATransactionCommit`. When enabled, we opt to no longer defer a call to `[CATransaction commit]`, because it could feasibly end a different transaction than intended. In practice, this was leading to issues with `UIViewPropertyAnimator`, where deffered commits were ending in-progress animators.

**This Change**

The results we have seen from enabling this fix show no changes to performance and stability, so this seems safe to roll out. This change removes the experiment, and enables the new, non-deffered behavior.

Reviewed By: lorixx

Differential Revision: D20120169

fbshipit-source-id: 0473652020a250d67b02b860fb74c73e43615aef
2020-02-26 10:55:31 -08:00
Zhisheng Huang
191063e7cc Fix the displayDelegate bug from IGListSectionController
Summary:
We were using the iVar version of the `_displayDelegate`, but turned out a lot of product callsite just manually override the `displayDelegate` instead of use `self.displayDelegate = self`.

Let's use the self.displayDelegate instead.

Reviewed By: bdotdub

Differential Revision: D20037298

fbshipit-source-id: fa860adfa88cd088f39718279983acd32e90b478
2020-02-21 11:51:44 -08:00
Zhisheng Huang
6dfdce1d5e Remove IGListBindingSingleSectionController's displayDelegate override
Summary:
There is a KP in IGListBindingSingleSectionController that we need to override the `displayDelegate` in order to track the displayingCell for performant update, when the section controller is not visible.

With the newly refactoring in how IGListSectionController handles the displaying events, IGListBindingSingleSectionController can now override the willDisplay/endDisplay calls without manually adding itself as the `displayDelegate`, the behavior works as before.

Differential Revision: D19973670

fbshipit-source-id: 1f9fec1bf88aa8755c163c636ebb49b377e6873c
2020-02-20 15:22:47 -08:00
Zhisheng Huang
e960e68c0f Move the display delegate invokation into IGListSectionController
Summary:
Previously, IGListDisplayHandler took over the sectionController's displayDelegate and invoke directly.

We have requirement in other cases where we want to control the displayDelegate invokation, e.t. Subclass of IGListSectionController can listen to the willDisplay/endDisplay events and do other processing.

Moving the displayDelegate invokation inside IGListSectionController would allow us to have better control on the invokation timing.

Differential Revision: D19973669

fbshipit-source-id: 33d23bc7efb235d2e1ed99737200e56bb320b678
2020-02-20 15:22:46 -08:00
Zhisheng Huang
bb89f70510 Fix a bug in IGListBindingSingleSectionController for displayingCell setting
Summary:
When a section/cell is reloaded, UICollectionView actually calls:

1/ WillDisplay (new cell)
2/ DidEndDisplay (old cell)

So if we set `_displayingCell` in willDisplay call, then set it to nil in didEndDisplay, we would just have a nil cell. Thus we need to make sure the cell in `didEndDisplay` match with the previous `_displayCell` to avoid nil-ing ourselves out.

Reviewed By: alanzeino

Differential Revision: D19906734

fbshipit-source-id: 5217908ae99d488a2af5ff3f90ef8e021774acda
2020-02-14 15:28:42 -08:00
Benny Wong
fecf9e4124 Convert IGAssertNonnull to a IGAssert( != nil) (#1425)
Summary:
* This was introduced in https://github.com/instagram/IGListKit/commit/b4dc116e
* This is currently breaking our CI build
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1425

Reviewed By: joetam

Differential Revision: D19701505

Pulled By: bdotdub

fbshipit-source-id: f7be49c7b2e78ae283a9fa602192fceabbbe597c
2020-02-11 08:42:04 -08:00
Jeremy Lawrence
a9ecf5d476 Remove assert from working range handler (#1418)
Summary:
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1418

This assert causes crashes on debug builds. While it's known that this algorithm is slow with a large number of items to work through, it doesn't seem to have been an issue for most when working with IGListKit. Removing this assertion to avoid crashes for others.

Reviewed By: bdotdub

Differential Revision: D19251924

fbshipit-source-id: c0e78d3963544b949bed823bdac9b39529ca5f9f
2020-01-21 12:51:06 -08:00
Zhisheng Huang
fcd452e366 Fix a bug in IGListBindingSingleSectionController
Summary:
Originally we want to update the cell when the SectionController is asked to update to a new value, that's pretty much what the experiment `singleItemSectionUpdates` is for inside `IGListAdapterUpdater`.

However, we should not request any cell during the initial setup, otherwise it would trigger cell to render in a wrong time, in particular we shouldn't call

```
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
```
as the data source set up is not ready, and it can get crashy to compare the initial dataSource(nil) to the valid data source(IGListAdapter), which doesn't make sense.

So tl;dr is do not access cell during the initial data source setup. We might need to audit other callsite that might have violate this invariant.

Solution here is to rely on the willDisplay/endDisplay API from `IGListDisplayDelegate` so that we can set/unset the displaying cell here before we configure the cell with the updated data. This change is also safe as it's protected by `_enabledCellConfigurationDuringUpdate` which defaults to be NO.

= Facebook =

Also currently the `singleItemSectionUpdates` is only setup for Inbox thread-bump useage for now. So I added a `enabledCellConfigurationDuringUpdate` to properly gate it behind QE so that we have a safer exit here.

Reviewed By: maxolls

Differential Revision: D19332040

fbshipit-source-id: cbca7a63b0486c053ceabe759ce316f5d841fef5
2020-01-09 14:53:37 -08:00
Koen Punt
ee883d308d remove non-existing parameters from docblock (#1412)
Summary:
The `cellClass` parameter was still documented, but no longer present in the method signature.
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1412

Reviewed By: lorixx

Differential Revision: D19178421

Pulled By: iperry90

fbshipit-source-id: 17e69db2c5d52581bfd205b5557c6564cf0e5673
2019-12-20 10:59:06 -08:00
Nate Stedman
1a44045dce Run lint on IGListKit
Differential Revision: D19141253

fbshipit-source-id: 9ed4c278a91bb48a1f6d33cafa9ce8f21861573d
2019-12-19 09:34:42 -08:00
Koen Punt
f1ceedc39b Refine dequeueReusableCellOfClass methods for Swift (#1388)
Summary:
## Changes in this pull request

Initial suggested implementation for https://github.com/Instagram/IGListKit/issues/1387.

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1388

Reviewed By: lorixx

Differential Revision: D18687735

Pulled By: natestedman

fbshipit-source-id: f9cc70ced3f788771fd3f0443b56befbedb04166
2019-12-19 08:13:22 -08:00
Jordan Smith
6414e778b4 Add an experiment for inline CATransaction commits
Summary:
**Context**

When performing non-animated updates, `IGListKit` does so by beginning a `CATransaction` before `performBatchUpdates:`, and ending it in the completion block. While this disables animations for the collection view updates, it is feasible that some other changes might be bundled into the same transaction, given that we have no guarantee of the completion block being called inline.

It seems that this is happening in practice and occasionally disrupting `UIViewPropertyAnimator` animations, forcing the completion immediately.

**This Change**

To fix this issue, we can commit the transaction inline. Here we use `performWithoutAnimation:`, although it's possible that this is just a wrapper around `CATransaction` calls anyway.

Because the change may have unknown side effects, this change is gated by an experiment.

Reviewed By: maxolls

Differential Revision: D19150307

fbshipit-source-id: f7cff46ac7141609f42caafaf69bad71a980ad29
2019-12-17 16:57:39 -08:00
Nate Stedman
9135cabe28 Use IGListAssert, not IGAssert
Reviewed By: lorixx

Differential Revision: D19141254

fbshipit-source-id: a93ae649be4d2430bf28208391ad027e02cdea3e
2019-12-17 13:07:17 -08:00
Zhisheng Huang
ce7718c289 Add singleItemSectionUpdates to IGListAdapterUpdate to use simpler updates
Summary:
= Problem =

Most of the UICollectionView/List UI only needs to deal with 1 dimensional array of data. The current N section N item setup is a big more complicated for most use case who only deals with 1 dimensional array.

In fact, the IGListDiff algorithm works pretty with 1 dimensional array. Then inside `IGListAdapterUpdater`, we do a lot changes to ensure UICollectionVie do not crash:
1. Convert section moves -> delete+insert;
2. Convert section reload -> delete+insert;

This results in the animation limitation for the UI updates, we lose the move animation support by UICollectionView and the updates for delete+insert does not look great.

= Solution =

Since direct inbox or direct message list view only uses N section, with single item setup.

We don't need to do crazy changes like changing moves->delete+insert, and use -reloadSections etc. for updates.

We can just use whatever the IGListDiffingResult returns and be done with it.

More context, see my post and the Better Animation part I listed in the group: https://fb.workplace.com/groups/iglistkit/permalink/1009885999357045/

Reviewed By: iperry90

Differential Revision: D18856355

fbshipit-source-id: 50cf93a6903f0c86c44e5e1289384efe8db9acc1
2019-12-16 17:50:50 -08:00
Zhisheng Huang
b4dc116e20 Add a IGListBindingSingleSectionController
Summary:
= Problem =

Most of the UICollectionView/List UI only needs to deal with 1 dimensional array of data. The current N section N item setup is a big more complicated for most use case who only deals with 1 dimensional array.

In fact, the IGListDiff algorithm works pretty with 1 dimensional array. Then inside `IGListAdapterUpdater`, we do a lot changes to ensure UICollectionVie do not crash:
1. Convert section moves -> delete+insert;
2. Convert section reload -> delete+insert;

This results in the animation limitation for the UI updates, we lose the move animation support by UICollectionView and the updates for delete+insert does not look great.

= Solution =

Hence I am proposing to use simple **Single Item** Section Controller, and we can apply the diffing result directly to the UICollectionView, which is much simpler.

However, for the inline section update, we need to support update at the right timing: inside -didUpdateObject:, and now we want to get back the existing cell, and apply data to it.

Ideally, `IGListSingleSectionController` is the right call but `IGListSingleSectionController` is not subclassable and we would also need to change the way -didUpdateObject: works in that class.

Hence I am building this `IGListBindingSingleSectionController`, which only contains single item, and it can update/bind the cell whenever item is updated.

Reviewed By: iperry90

Differential Revision: D18942974

fbshipit-source-id: 539fbe2b72691b649e3ae3d8ed725006bc54b705
2019-12-16 17:50:50 -08:00
Zhisheng Huang
64f053c258 Refactor and move the applyUpdate code into Helper file
Summary: I want to reuse this collection view update code in next diff, let's move it to a Helper file to support code sharing.

Reviewed By: calimarkus, iperry90

Differential Revision: D18714061

fbshipit-source-id: a85e8576226276fcab90ea1d2ed23aac5501aa17
2019-12-04 15:32:04 -08:00
Zhisheng Huang
da4a5bbf25 Simplify the code and use _itemCountIsZero (#1400)
Summary:
…uld show empty view

## Changes in this pull request

Basically we can use the existing _itemCountIsZero like all the other usage, and it's faster since it stopped early, compared to before we loop through all the sectionController.numberOfItems and sum up.

### Checklist

- [x] All tests pass. Demo project builds and runs.
- [ ] I added tests, an experiment, or detailed why my change isn't tested.
- [ ] 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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1400

Differential Revision: D18687637

Pulled By: lorixx

fbshipit-source-id: bcdc57ba43b86cd0ed639ffaab9ae0493fd2f844
2019-11-27 09:23:18 -08:00
Jefferson Setiawan
f50f3c7ef6 Support Project Catalyst (#1398)
Summary:
## Changes in this pull request

Add support when compile Catalyst.
Fix this error: `Cannot define category for undefined class 'IGListAdapter'`
![Screenshot 2019-11-22 at 22 35 31](https://user-images.githubusercontent.com/14871122/69440931-49979c80-0d7c-11ea-8673-f9b8a60441f0.jpg)

## Step To Reproduce
In the Main target, check the Mac under Deployment Info, more Info in [here](https://developer.apple.com/documentation/uikit/mac_catalyst?language=objc)

### Checklist

- [x] All tests pass. Demo project builds and runs.
- [x] I added tests, an experiment, or detailed why my change isn't tested.
- [ ] 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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1398

Differential Revision: D18687673

Pulled By: lorixx

fbshipit-source-id: b5b9aa60406c9b66a48abbdfeea2bc5f44c9ca66
2019-11-27 09:23:17 -08:00
kinarob
7fe113fea8 Remove useless system version code (#1396)
Summary:
## Changes in this pull request

`Examples/Examples-iOS/Pods/Pods.xcodeproj/project.pbxproj`
`Examples/Examples-tvOS/Pods/Pods.xcodeproj/project.pbxproj`

this change just Xcode 11.2 generated.

This pr aim to remove useless `IGSystemVersion` file.

### Checklist

- [x] All tests pass. Demo project builds and runs.
- [ ] 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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1396

Reviewed By: lorixx

Differential Revision: D18638299

Pulled By: iperry90

fbshipit-source-id: 0b6583f1210e5d1570dd672eed8c59901d6785f6
2019-11-21 09:56:43 -08:00
Zhisheng Huang
f3175ec31f Update the version to be 4.0
Summary:
As title, let's prepare the 4.0 release with the version bump.

1. Change the Source/Info.plist to have 4.0.0 for CFBundleShortVersionString.
2. Manually update any .md files that used the old release versions.
3. Run `./scripts/setup.sh` to re-update all the pods and the Example projects.

Reviewed By: natestedman

Differential Revision: D18616823

fbshipit-source-id: ca0f2a09cdd9ab592c2cb002fe923e195ce3ab12
2019-11-20 16:23:15 -08:00
Andrea Antonioni
ada811e1bb IGListAdapterDelegate needs Swift name of ListAdapterDelegate (#1116)
Summary:
## Changes in this pull request

Add Swift name annotation `ListAdapterDelegate` to `IGListAdapterDelegate`. The breaking change is written in the `CHANGELOG.md` for the `4.0.0` release

Issue fixed: https://github.com/Instagram/IGListKit/issues/1115

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1116

Reviewed By: bdotdub

Differential Revision: D18278551

Pulled By: iperry90

fbshipit-source-id: db9d1910fc4be7ffa723ee291a9c65db0fd217c0
2019-11-06 09:16:17 -08:00
Ian Perry
2fa963bfa3 Drop support for iOS 8 (#1381)
Summary:
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1381

https://github.com/Instagram/IGListKit/issues/1078

Dropping support for iOS 8
- Removed checks for iOS 8
- Updated xcodeproj file
- Updated Travis
- Updated podspec

Reviewed By: bdotdub, lorixx

Differential Revision: D18249291

fbshipit-source-id: eba9814b71e67fdc0ef50fcbc809189d86e8c5fb
2019-11-01 12:40:19 -07:00
Nate Stedman
e4c60650f2 Split IGListKit and IGListDiffKit (#1377)
Summary:
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1377

This splits the diffing-only components from `IGListKit` out into a separate library, `IGListDiffKit`, allowing them to be used independently of the rest of `IGListKit`. We've found that the diffing components of the library are useful independently of the rest of the `UICollectionView` infrastructure, and separating the libraries allows apps to take advantage of those components without paying the full binary size cost of `IGListKit`. The diffing components are available as a subspec in Cocoapods, and as an independent framework in Carthage and direct Xcode project import (i.e. Git submodules).

This is a breaking change, necessitating a major version bump, although it should have only minor impact for projects using the umbrella header `IGListKit.h`, as that header continues to import the diffing utilities. In particular, for a project using Cocoapods and importing `IGListKit.h`, there should be no code changes required.

Reviewed By: calimarkus

Differential Revision: D18114249

fbshipit-source-id: 363b5a427e32800bbc6e82f897230963b4167245
2019-10-31 08:26:12 -07:00
Maxime Ollivier
7824698610 prevent crash when inserting and deleting the same NSIndexPath multiple times
Summary:
Issue: The `NSIndexPath` level updates are really tricky because they don't go through the diffing process. It's up to the caller to make sure that the inserts/deletes/moves all add up to the final number of items. And it's not uncommon that 2 different updates will try to change the same `NSIndexPath` at the same time, which can cause headaches and crashes. For example, if we insert/delete the same `NSIndexPath` twice in the same update pass, we end up with 2 inserts and 1 delete, because we remove duplicated deletes. This causes an `NSInternalInconsistencyException` since things don't add up at the end.

Fix: Lets also remove duplicate `NSIndexPath` inserts to balance things out. In the future, it would be nice to get rid of this API entirely and have everything go through the diffing.

Reviewed By: lorixx

Differential Revision: D17423776

fbshipit-source-id: 62fdf5bd521a915e984e8de180c74858f7ae7ef4
2019-09-17 15:31:54 -07:00
Hanton Yang
b01010e5e9 Deprecate IGListStackedSectionController (#1355)
Summary:
## Changes in this pull request

Issue fixed: https://github.com/Instagram/IGListKit/issues/1099

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1355

Reviewed By: Ziewvater

Differential Revision: D17200801

Pulled By: lorixx

fbshipit-source-id: 22bb1abc69b38c9d856621fe848c09e61a9d41ef
2019-09-16 12:28:01 -07:00
Maxime Ollivier
6faddd99c9 avoid layout before IGListAdapter scrollToObject
Summary:
* Issue: `[IGListAdapter scrollToObject ...]` currently calls `[collectionView layoutIfNeeded]` before scrolling which creates the current visible cells that will no longer be visible after the scroll. This causes perf issues when we scroll immediately after creating the view controller.
* Fix: Instead of asking the layout object for the attributes, lets go throught the `UICollectionView`. So if the attributes are not ready, the `UICollectionView` will call `-prepareLayout`, return the attributes, but doesn't generate the cells just yet.

Differential Revision: D17326459

fbshipit-source-id: 745942225e0311fea7c3efb07ac1e8b8e0a82996
2019-09-13 14:57:52 -07:00
Maxime Ollivier
cddb29799c fix supplementary view crash when using IGListCollectionViewLayout
Summary:
* Issue: Calling `[UICollectionView layoutAttributesForSupplementaryElementOfKind...]` with an indexPath that doesn't have a supplimentary view.
* Cause: `IGListCollectionViewLayout` always returns a non-nil `UICollectionViewLayoutAttributes` when calling `layoutAttributesForSupplementaryViewOfKind` which tells the `UICollectionView` that it's fair game to ask the dataSource for a supplementary view at the indexPath. But when it does, the section controller could return nil, which throws an expection.

In the Apple docs about `[UICollectionViewDataSource collectionView:viewForSupplementaryElementOfKind:atIndexPath:]`

> This method must always return a valid view object. If you do not want a supplementary view in a particular case, your layout object should not create the attributes for that view.

https://developer.apple.com/documentation/uikit/uicollectionviewdatasource/1618037-collectionview?language=objc

* Fix: Just like `UICollectionViewFlowLayout`, if the supplementary view size is empty, lets return a nil attribute.

Reviewed By: Ziewvater

Differential Revision: D17326461

fbshipit-source-id: 507e98f43e951216cf2eafe2449f87df25439e11
2019-09-13 14:57:52 -07:00
Hanton Yang
628c547cc6 Remove the redundant __IPHONE_11_0 (#1351)
Summary:
## Changes in this pull request

Remove the redundant __IPHONE_11_0, because the minimum requirement is Xcode 9.0+ now.

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1351

Differential Revision: D17200815

Pulled By: lorixx

fbshipit-source-id: 25705856cf26d5c215ed956802ab1022c98cbca0
2019-09-04 23:23:25 -07:00
Hanton Yang
93da0852d1 Remove unused headers (#1358)
Summary:
###  Changes in this pull request

* Improve compilation time by reducing unnecessary compilation dependencies
* More clean code

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1358

Differential Revision: D17200761

Pulled By: lorixx

fbshipit-source-id: 9c6bca4d3d5e2e4b35125c7a12e483d58993c4e8
2019-09-04 23:06:57 -07:00
Hanton Yang
b194eb21e3 Update queue priority in Background Diffing (#1363)
Summary:
## Changes in this pull request

Update to use `QoS` and take higher priority for responsiveness and energy efficiency.

Following the guideline in the doc [Energy Efficiency Guide for iOS Apps](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html).

It's better to use `User-initiated` QoS in `Background Diffing` because it focuses on "Work that the user has initiated and requires immediate results".

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1363

Differential Revision: D17200745

Pulled By: lorixx

fbshipit-source-id: 4b9b2159f06edeed92e79bac771fe7b89f6d5708
2019-09-04 23:04:18 -07:00
Markus Emrich
323887920d Remove stringWithFormat: calls without parameters (#1360)
Summary:
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1360

`codemod -m -d ~/fbsource/fbobjc/ --extensions m,mm '\[NSString stringWithFormat\:\@\"([^\"]*?)\"\]' '@"\1"'`

Excluded third party libraries.

Differential Revision: D15590354

fbshipit-source-id: 954db583a02e0da26ea52ad7b8762e1d8f902ab4
2019-08-20 15:11:30 -07:00
Hanton Yang
cb344f9814 Delete duplicate headers in IGListKit.h (#1347)
Summary:
## Changes in this pull request

Delete duplicate headers in `IGListKit.h`

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1347

Reviewed By: joetam

Differential Revision: D16542316

Pulled By: joetam

fbshipit-source-id: feaaaaca0f9eddc4be58996c8a3a2521a7817185
2019-08-01 17:52:41 -07:00
Bofei Zhu
b7bc76dce4 Change paths to path (#1205)
Summary:
## Changes in this pull request
Should map be a map of `IndexPath`s instead of arrays of `IndexPath`s? Also, we might need some unit tests on this part. I don't think it's covered.

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1205

Reviewed By: Ziewvater

Differential Revision: D15962803

Pulled By: lorixx

fbshipit-source-id: f207b69ef0ebad08cd72b14ba53101e56d1604fd
2019-06-25 11:46:46 -07:00
Dennis Müller
0ac855df99 Fix - Cell Reordering in IGListBindingSectionController (viewModels array not being updated) (#1274)
Summary:
- See #1262 (cell reordering using a binding section controller caused problems)

## Changes in this pull request
- Added method override in `IGListBindingSectionController` to update the internal `viewModels` array after a cell has been moved
- Subclasses of IGListBindingSectionController require to call super

Issue fixed: #1262

I've added a test for this change. Is this enough? Or should I add more corner cases or something?

### Checklist

Some tests fail, but they do seem unrelated. I don't know if this is normal. I haven't changed anything regarding those failing tests.

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1274

Reviewed By: candance

Differential Revision: D15592822

Pulled By: lorixx

fbshipit-source-id: d81c18bec0ad0a6a6613089245352bb182a92f26
2019-06-23 23:25:09 -07:00
Aaron Pang
78cca5bc43 Add experiment to have the collection view layout check the collection view instead of the collection view layout [2/2]
Summary:
The collection view layout here should not be accessing the data source directly but instead asking the collection view for the number of sections and number of items. This is because the collection view holds an internal cache and if there is a discrepancy between when the collection view cache and the data source, preparing the layout will crash the app because we will send a layout down to the collection view with a items that might not exist in the collection view's cache but exist in the data source.

This diff adds an experiment to see the impact of fixing this check so that when we prepare layouts we don't ask the data source directly but ask the collection view instead. The collection view will then update it's cache and check the data source so it does not crash when we prepare a layout.

```
NSInternalInconsistencyException at __45-[UICollectionViewData validateLayoutInRect:]_block_invoke:
UICollectionView received layout attributes for a cell with an index path that does not exist:
<NSIndexPath: 0xc198a8c3ea391fbb> {length = 2, path = 4 - 0}
```

Reviewed By: lorixx

Differential Revision: D15830610

fbshipit-source-id: f3dae3e87c55b86c3b686309c1144ccfff1375bf
2019-06-14 16:23:46 -07:00
Zhisheng Huang
8a0c69ba29 Cleanup the skiplayout in reloadData fallback
Summary: The test was actually deallocated last year, and this test is never cleaned up. Now let's clean it up.

Reviewed By: chritto

Differential Revision: D15777898

fbshipit-source-id: c3a704ee1bfdd085c4ceb89af424a10ed07a65b6
2019-06-12 18:35:54 -07:00
Qinghua Hong
08bf69cc2f Fix #1275 layouts inconsistency in updateAnimated:completion of IGListBindingSectionController (#1285)
Summary:
## Changes in this pull request

Issue fixed: https://github.com/Instagram/IGListKit/issues/1275

This PR is straintforward solution as mentioned in https://github.com/Instagram/IGListKit/issues/1275. When I finished it, I realized that it is not a problem in `IGListCollectionViewLayout Partial Optimization` and `IGListBindingSectionController` deserved it. Maybe `IGListCollectionViewLayout` is rarely used because of great builtin UICollectionViewFlowLayout or cells in section rarely need changing their sizes in practices.

Despite it is not `IGListCollectionViewLayout`'s fault, I think it can be more optimized against `invalidateLayoutWithContext`. I would like to make an another PR to optimize it.

Due to this PR just giving a proposed solution, it lacks of adding tests and changing log. When this solution is accepted, I would like to complete these todos.

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1285

Reviewed By: candance

Differential Revision: D15592807

Pulled By: lorixx

fbshipit-source-id: ae06abce896341509de4f3dfb73b3a7bc0a68c51
2019-06-11 22:29:34 -07:00
kinarob
de08713b33 Remove intercepted duplicate selector in IGListAdapterProxy. (#1291)
Summary:
## Changes in this pull request

### Checklist
Don't need tests.

- [x] All tests pass. Demo project builds and runs.
- [x] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1291

Reviewed By: lorixx

Differential Revision: D15564138

Pulled By: candance

fbshipit-source-id: a0fabbd6a8f8389b09da7cd5484df75d67a709e5
2019-06-01 11:55:12 -07:00
Qinghua Hong(qhhonx)
619b835710 Fix scrollToObject: inconsistency bug when scrolling to bottom/right with content inset (#1284)
Summary:
The implementation of
```Objective-C
-[IGListAdapter scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:animated:]
```
has little inconsistencies where the `UICollectionViewScrollPositionLeft` and `UICollectionViewScrollPositionTop` considering the content inset left/top of the collection view was being applied to the final offset. However, the `UICollectionViewScrollPositionRight` and `UICollectionViewScrollPositionBottom` ignoring the content inset right/bottom of the collection view was being applied to the final offset. The different result is that scrolling to the most `Left/Top`, the first section content always be visible by considering its content inset while scrolling to the most `Right/Bottom`, the last section content always be fully displayed but not be fully visible by considering its content inset.

## Changes in this pull request

Issue fixed: #

### Checklist

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1284

Reviewed By: lorixx

Differential Revision: D13590416

Pulled By: lorixx

fbshipit-source-id: ae52be9e5ba25b50c7a0ad768a4af728347523e2
2019-05-25 12:48:21 -07:00
Andrew Breckenridge
05e680f1cb #trivial fix inconsistent assignment ordering
Summary: Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1315

Differential Revision: D15425369

fbshipit-source-id: 54abf0f0c2258a02bdfd804f6553d6b74ab517a8
2019-05-20 19:13:22 -07:00
Benny Wong
831e9b8809 Fix travis & upgrade cocoapods (#1317)
Summary:
This is a bigger PR than I'd like but there is a bunch of stuff in here that feels like we should land all at once to fix the Travis setup.

Currently, there is a few things wrong. Briefly:
1. Travis is failing to even build the library (see: [build 2298](https://travis-ci.org/Instagram/IGListKit/jobs/506564900))
2. There are legitimately failing tests
3. Travis seems to be flakey running UI tests

This PR deals with the first two.

The Xcode projects were not building because some recently added files weren't added to the xcodeproj (ie. 46a124ddfe and 4662454c4a).

Also added `Foundation.h` import for `bool` definition for `IGSystemVersion` (also a new file)

The main `Podfile.lock` was already being generated via `1.5.3` (0c0b31ad7c) but the `Gemfile` had the wrong version and none of the example project `Podfile.lock`s were re-generated with it.

Once I got the projects correctly building and tests running, I discovered there were a bunch of tests that were legitimately failing. It's unclear when these started failing and what caused it.

I thought it made sense to disable these tests for now and then create Github issues to fix them as starter tasks instead of making this diff even larger.. I can create those if that sounds good.

Somewhat related, it seems like the UI tests on Travis may be a bit flakey. They pass locally, but breaks on Travis [[example](https://travis-ci.com/bdotdub/IGListKit/jobs/195758250)] with error messages like `Failure requesting automation session for com.instagram.IGListKitExamples:85190`

----

- [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)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1317

Reviewed By: rnystrom

Differential Revision: D15157375

Pulled By: rnystrom

fbshipit-source-id: b29131f59b74398b6d2b3a73453248cb3325a955
2019-05-01 15:13:25 -07:00
Maxime Ollivier
4f9c61a37f clean up IGListExperimentBackgroundDiffingSerial
Summary: * Cleaning up experiment

Reviewed By: lorixx

Differential Revision: D15134137

fbshipit-source-id: a3f5a6d7b4a5f3897608c4e32ad4c4e6e4e720e5
2019-04-30 10:50:52 -07:00
Maxime Ollivier
4662454c4a create IGListAdapterPerformanceDelegate
Summary:
* Currently, there's no easy way to measure how long we spend dequeueing cells or handling scroll events across the app. This makes it a bit difficult to catch scroll-perf issues early on.
* Fix: Lets create `IGListAdapterPerformanceDelegate` which gives us that information.

Reviewed By: rnystrom

Differential Revision: D14430449

fbshipit-source-id: 7bc170bdaa37807c8719976e8818f3a578ee17dd
2019-03-14 18:10:00 -07:00
Zhisheng Huang
2f76e8ce68 Cleanup the coalescing time experiment
Summary:
We have observed that keeping the coalescing time here would actually decrease the stability here, it makes the app crash more often.
It's probably caused by some race condition during that time and UICV updates become out of sync.

Reviewed By: rnystrom

Differential Revision: D14379265

fbshipit-source-id: 502c1c14fb8bdfc35969f721687e82888b160110
2019-03-08 09:58:14 -08:00
Zhisheng Huang
9e59bdea11 Remove the unnecessary assert which would affect IGListKit perf
Summary:
This assert was hoping to find if there are any duplicates from the `fromObjects`. However, from the finding, we did not see any assertion or trace that this is the case.

The `objectsWithDuplicateIdentifiersRemoved` is actually doing extra work during updates.

We should remove this for the sake of better scroll perf and faster UI update.

Reviewed By: calimarkus

Differential Revision: D14339124

fbshipit-source-id: ff40fd23a05640058673d46f63a9e4bf516dd3f6
2019-03-06 13:04:53 -08:00
Scott Wolchok
035808e750 Don't call [UIDevice currentDevice] in +load
Summary: sysctl should be faster.

Reviewed By: timonus

Differential Revision: D13981833

fbshipit-source-id: ae7a67d4eb69595441a4a66e0ef0a271762f77ce
2019-02-08 14:42:56 -08:00