BMACollectionBatchUpdates
is a set of classes to generate updates and extensions to UICollectionView
and UITableView
to perform them safely in a batch manner.
In order to generate the mentioned updates it has to make collection item and section conform the BMAUpdatableCollectionItem
andBMAUpdatableCollectionItem
protocols respectively:
@interface BMAExampleItemsSection : NSObject <BMAUpdatableCollectionSection>
@end
@interface BMAExampleItem : NSObject <BMAUpdatableCollectionItem>
@end
Once both old and new data models are available, it has to calculate changes and apply them:
@implementation BMAExampleCollectionViewController
- (void)setSections:(NSArray *)sections {
[BMACollectionUpdate calculateUpdatesForOldModel:self.sections
newModel:sections
sectionsPriorityOrder:nil
eliminatesDuplicates:YES
completion:^(NSArray *sections, NSArray *updates) {
[self.collectionView bma_performBatchUpdates:updates applyChangesToModelBlock:^{
_sections = sections;
} reloadCellBlock:^(UICollectionViewCell *cell, NSIndexPath *indexPath) {
[self reloadCell:cell atIndexPath:indexPath];
} completionBlock:nil];
}];
}
@end
@implementation BMAExampleTableViewController
- (void)setSections:(NSArray *)sections {
[BMACollectionUpdate calculateUpdatesForOldModel:self.sections
newModel:sections
sectionsPriorityOrder:nil
eliminatesDuplicates:YES
completion:^(NSArray *sections, NSArray *updates) {
[self.collectionView bma_performBatchUpdates:updates applyChangesToModelBlock:^{
_sections = sections;
} reloadCellBlock:^(UITableViewCell *cell, NSIndexPath *indexPath) {
[self reloadCell:cell atIndexPath:indexPath];
} completionBlock:nil];
}];
}
@end
BMAUpdatableCollectionItem
conforms to NSObject
protocol and by doing so it provides isEqual
method for comparing items. In most cases comparing uids in isEqual
will be enough, but sometimes your model may contain additional properties that can change and requie cell update.
Simple example: online status which can be either online or offline. When it changes we need to gerenrate cell update for this item. To detect this change isEqual
can be implemented in following way:
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[self class]]) {
return NO;
}
BMAExampleItem *item = (BMAExampleItem *)object;
return [self.uid isEqual:item.uid] && self.isOnline == item.isOnline;
}
@end
-
Include the following line in your
Podfile
:pod 'BMACollectionBatchUpdates', '~> 1.1'
If you like to live on the bleeding edge, you can use the
master
branch with:pod 'BMACollectionBatchUpdates', :git => 'https://github.com/badoo/ios-collection-batch-updates'
-
Run
pod install
- Clone, add as a submodule or download.
- Add all the files under
BMACollectionBatchUpdates
to your project. - Make sure your project is configured to use ARC.
Source code is distributed under MIT license.
Read more on our tech blog or explore our other open source projects