SwiftData中如何等待上下文更新后再执行后续操作?
SwiftData 上下文更新异步问题的解决办法
问题1:插入数据后@Query数组未即时更新
@Query的更新绑定到SwiftUI视图的渲染周期,上下文完成插入操作后,items数组不会立刻同步最新数据,直接打印会得到旧值。
解决办法:
如果需要即时获取最新数据,不要依赖@Query的items,直接从上下文手动查询:
func addItem() { let item = Item() context.insert(item) selectedItem = item // 手动查询上下文内的所有Item if let fetchedItems = try? context.fetch(FetchDescriptor<Item>()) { print(fetchedItems) } }
如果只是需要在视图中显示最新数据,无需手动打印,@Query会在视图下一次刷新时自动更新items数组,界面会同步显示新增内容。
问题2:删除后依赖@Query数组判断选中项失效
删除操作完成后,@Query的items数组不会立刻更新,导致后续的空数组判断、包含性检查都基于旧数据,逻辑失效。
解决办法:
操作时先记录要删除的对象ID,直接通过ID判断选中项是否被删除,无需依赖未更新的items数组:
func deleteItem(at offsets: IndexSet) { // 先记录所有要删除的Item的ID let deletedIds = offsets.map { items[$0].id } // 执行删除操作 for index in offsets { context.delete(items[index]) } // 直接通过ID判断选中项是否在删除列表中 if let selectedId = selectedItem?.id, deletedIds.contains(selectedId) { selectedItem = nil } else { // 检查数据库是否真的为空(手动查询上下文) if let fetchedItems = try? context.fetch(FetchDescriptor<Item>()), fetchedItems.isEmpty { selectedItem = nil } } }
也可以利用SwiftData对象的isDeleted属性(确保上下文已处理删除),直接通过selectedItem?.isDeleted是否为true来清空选中状态。
内容的提问来源于stack exchange,提问作者waspinator
相关产品推荐
相关产品推荐

