(WWDC) UI 数据源的进步


内容概览

  • 现状
  • 新方法
  • Demos
  • 注意事项




现状

实现 UICollectionViewDataSource 协议中的方法

UICollectionViewDataSource 简单、灵活,但这也致使应用变得复杂。
使用 UICollectionViewDataSource 时,通常需要 Controller 来维护 UI 数据。


更新 UI 可能会遭遇一些问题,比如:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Invalid update: invalid number of sections. The number of sections contained in the 
collection view after the update (10) must be equal to the number of sections contained in the 
collection view before the update (10), plus or minus the number of sections inserted or
deleted (0 inserted, 1 deleted).'
***

问题的根源在于:

  • 数据源和当前 UI 状态必须总是保持一致
  • 目前的方法容易导致错误
  • 没有集中的事实




新方法

Diffable Data Source

performBatchUpdates() 方法复杂、繁琐而且易导致崩溃
apply() 方法简单而且可以自动辨别更新


Snapshot

  • UI 状态的事实
  • Section 和 Item 都有唯一的 ID
  • 不再需要依赖 IndexPath

当前快照

将新快照应用到旧快照上

最终的快照

苹果提供的相关类型:

// 集中的数据源
UICollectionViewDiffableDataSource
UITableViewDiffableDataSource
NSCollectionViewDiffableDataSource

// 数据源快照
NSDiffableDataSourceSnapshot




Demos

点击下载 官方 Demo

下载后,解压。然后使用 Xcode 11 打开。

只需要关注 Diffable 部分




注意事项


更新数据源时:

  • 总是使用数据源的 apply() 方法
  • 不再使用 performBatchUpdates(), insertItems() 等方法

构建快照时:

  • 空快照

  • 当前数据源的快照


获取快照的状态


配置快照


标识符需要满足以下条件:

  • 必须唯一
  • 遵守 Hashable 协议
  • 使用数据模型或者对象的 ID

自定义标识符 示例


如何使用基于 IndexPath 的 API?


关于 apply() 方法:

  • 非常高效,时间复杂度为 O(1)
  • 允许在后台线程执行

需要注意的是,一旦选择在后台线程执行 apply() 方法,就不能再切换到主线程执行。
如果有错误发生,系统会对错误进行记录,或者用 assert 中断执行。



最后,强烈建议使用新方法:

  • 支持 iOS, tvOS 和 macOS
  • 自动配置动画
  • 易用、高效而且稳健





参考内容:
Advances in UI Data Sources




转载请注明出处,谢谢~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值