Doppelganger
Array diffs as collection view wants it
Install / Use
/learn @Wondermall/DoppelgangerREADME
Doppelganger
TL;DR;
<table> <tr> <td> <img src="https://raw.githubusercontent.com/Wondermall/Doppelganger/master/Screenshot_bad.gif" alt="bad ux" style="max-width:100%;" width="186px"> </td> <td> <img src="https://raw.githubusercontent.com/Wondermall/Doppelganger/master/Screenshot.gif" alt="good ux" style="max-width:100%;" width="186px"> </td> </tr> <tr> <td> Bad UX </td> <td> Good UX<sup>1</sup> </td> </tr> </table><sup>1</sup>: Slowed down intentionally to demonstrate the awesomeness
Problems it solves
- Calculating mutations is too hard and you're just calling
reloadDataon your collection or table view? - Users, confused where did that row disappear?
- Rows, jumping out of nowhere?
- Lost scroll position?
Doppelganger is here to help!
Usage
NSArray *oldDataSource = self.dataSource;
self.dataSource = [self _updatedDataSource];
NSArray *diffs = [WMLArrayDiffUtility diffForCurrentArray:self.dataSource
previousArray:oldDataSource];
[self.tableView wml_applyBatchChangesForRows:diffs
inSection:0
withRowAnimation:UITableViewRowAnimationRight];
Implementation details
- Currently, doppelganger supports only array of unique elements, e.g. if you have duplicated elements in your array, result is unpredictable.
- If you are using custom classes, make sure that it implements correctly
isEqual:andhashmethods: http://nshipster.com/equality/
TODOs
- Improve on O(n<sup>2</sup>) when calculating moved elements.
- Abstract API from
NSArray. - Your issue / pull request.
Installation
Doppelganger is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod "Doppelganger"
Author
Sash Zats, sash@zats.io
License
Doppelganger is available under the MIT license. See the LICENSE file for more info.
