iOS 13基于 Diffable 实现局部刷新
2021-02-26 本文已影响0人
冷武橘
在 iOS 13 中 Apple 为 UITableView 和 UICollectionView 引入了 DiffableDataSource,让开发者可以更简单高效的实现 UITableView、UICollectionView 的局部数据刷新。新的刷新的方法为 apply,通过使用 apply 方法无需计算变更的 indexPaths,也无需调用 reload,即可安全地在主线程或后台线程更新 UI, 仅需简单的将需要变更后的数据通过 NSDiffableDataSourceSnapshot 计算出来。
一、基本使用
#pragma mark - 1、创建一个 A diffable data 关联_tableview,
UITableViewDiffableDataSource *dffableSource = [[UITableViewDiffableDataSource alloc]initWithTableView:_tableview cellProvider:^UITableViewCell * _Nullable(UITableView * _Nonnull tableView , NSIndexPath * _Nonnull indexPath, id _Nonnull res) {
#pragma mark - 2、配置并返回cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"测试-%@",res];
return cell;
}];
self.dffableSource = dffableSource;
#pragma mark - 3、配置数据
NSDiffableDataSourceSnapshot *snapshot = dffableSource.snapshot;
#pragma mark - 3.1、确定有多少组
[snapshot appendSectionsWithIdentifiers:@[@"1"]]; //SectionIdentifierType不可以重复⚠️
[snapshot appendSectionsWithIdentifiers:@[@"2"]]; //根据需求添加更多的Section
#pragma mark - 3.2、确定每组的行数
[snapshot appendItemsWithIdentifiers:@[@"1",@"2",@"3"] intoSectionWithIdentifier:@"1"];
[snapshot appendItemsWithIdentifiers:@[@"4",@"5"] intoSectionWithIdentifier:@"2"];
#pragma mark - 3.3、刷新表格
[dffableSource applySnapshot:snapshot animatingDifferences:NO completion:^{
}];
注意:NSDiffableDataSourceSnapshot的实例对象,直接通过dffableSource.snapshot;
NSDiffableDataSourceSnapshot *snapshot1 = dffableSource.snapshot;
NSDiffableDataSourceSnapshot *snapshot2= dffableSource.snapshot;
NSDiffableDataSourceSnapshot *snapshot3= dffableSource.snapshot;
NSLog(@"snapshot1:%p",snapshot1);
NSLog(@"snapshot2:%p",snapshot2);
NSLog(@"snapshot3:%p",snapshot3);
控制台打印:snapshot1:0x600001778440; snapshot2:0x600001778450;snapshot3:0x600001778460
可知:每次dffableSource.snapshot得到的是不同的对象,这里在开发时就要注意了。