NSFetchedResultsController的didChange代理section插入顺序异常如何处理
NSFetchedResultsController 非顺序Section插入回调解决方案
- 首先明确核心规则:所有
controller(_:didChange:atSectionIndex:for:)回调传入的索引,全部基于本次批量变更开始前的FRC数据源快照,和回调触发顺序无关,也不会随前面的变更执行动态偏移。比如初始有3个section(索引0-2),本次需要新增2个section最终得到5个section,回调给出的插入索引4、3都是相对于初始3个section的状态计算的,不存在漏回调的问题。 - 禁止边接收回调边修改本地数据源/视图模型,正确的处理范式依赖FRC的前后置回调实现批量处理:
- 在
controllerWillChangeContent(_:)回调中初始化临时容器,用来存储本次所有的section变更、对象变更事件,不执行任何数据源修改操作 - 在
didChangeSection、didChangeObject回调中,仅将变更类型、对应索引、变更内容存入临时容器,不修改本地数据 - 在
controllerDidChangeContent(_:)回调中统一处理所有变更:- 先处理section删除操作:将所有待删除的索引按从大到小排序后依次移除,避免删除小索引导致后续大索引偏移出错
- 再处理section插入操作:将所有待插入的(索引,sectionInfo)对按从小到大排序后依次插入到本地数组对应位置,完全不会出现插入高索引时低索引不存在的越界问题
- 最后按相同逻辑处理section更新、移动,以及对象级别的增删改移操作
- 在
- 验证方式:所有变更处理完成后,对比你维护的本地数组和FRC的
sections属性,两者内容、顺序完全一致即为处理正确。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

