在DataSource中增删改单元格时,如何正确使用Snapshot?
DataSource中Snapshot插入/更新/删除操作的正确用法
两种方式的核心区别在于快照是否基于数据源的最新状态生成,具体适用场景和风险如下:
第一种方式(通用推荐)
每次操作都从dataSource获取最新快照,修改后再应用回去。这种方式能确保你始终基于数据源的当前状态做变更,不会因为其他地方修改了数据源而导致本地快照过期,从根源上避免数据不一致或变更丢失的问题。
代码示例:
func test() { var snapshot = dataSource.snapshot snapshot.insert/delete/append dataSource.apply(snapshot) }
第二种方式(需严格控制场景)
自己维护一个独立的Snapshot实例,修改本地副本后再应用到数据源。这种方式的风险很高:如果有其他操作(比如异步任务、其他方法)同时修改了数据源,你的本地快照会和数据源实际状态脱节,此时应用本地快照会直接覆盖掉数据源的最新变更,造成数据丢失。
只有当你能完全掌控数据源的所有变更入口(比如整个模块仅通过这个本地快照来管理数据源状态,没有其他修改路径),这种方式才可以安全使用。
代码示例:
final class Test { var snapshot = Snapshot() func test() { snapshot.insert/delete/append dataSource.apply(snapshot) } }
总结
绝大多数日常开发场景下,第一种方式是更稳妥的选择。第二种方式仅适合完全封闭的状态管理场景,否则极易引发数据一致性问题。
内容的提问来源于stack exchange,提问作者NyanNyan
相关产品推荐
相关产品推荐

