NSDiffableDataSourceSnapshot应用异常崩溃是系统bug还是使用错误?
问题原因说明
这是iOS系统UICollectionViewDiffableDataSource的内部实现bug,不属于使用方式错误。
该问题触发于差分动画计算的边界场景:当分区内原始条目数为2、同时执行删除1条+重载剩余1条的操作时,系统的差分计算逻辑会优先查询旧snapshot中已删除条目的cell来准备删除动画,此时新snapshot还没有完全同步到数据源内部,就会出现你调试时看到的「本地构造的snapshot条目已删除、但数据源持有的snapshot还未更新」的矛盾情况。当分区原始条目数≥3时,系统差分计算走了另一条逻辑分支,所以不会触发该问题。
推荐解决方案
你目前使用的返回空白cell的方案是可行的,系统最终会自动清理这些临时生成的空白cell,不会影响最终渲染效果,是实现成本最低的规避方案。除此之外还有两种更规范的优化方案:
- 调整操作逻辑:不要在同一个snapshot中同时执行同分区的删除条目+重载剩余条目操作,拆分为两次
apply:第一次先apply仅包含删除操作的snapshot,动画完成后再apply仅包含重载操作的snapshot。如果不需要展示过渡动画,可以将apply方法的animatingDifferences参数设为false,避免两次动画带来的闪烁问题。 - 替换重载方式:如果你需要重载该分区下所有剩余条目,可以直接调用
reloadSections(_:)方法重载整个分区,替换原有的reloadItems(_:)调用,也可以避开该边界bug。
内容的提问来源于stack exchange,提问作者Robert Dresler
相关产品推荐
相关产品推荐

