You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:11:04