如何在SwiftData中使用背景上下文?正在自动查找CoreData MergesChangesFromParent等效项

smdncfj3  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(109)

我正在用SwiftData重构我的模型层。我已经让我的模型工作,容器设置和工作,现在我想开始使用CRUD操作的后台上下文。
下面是我如何设置我的容器:

@Observable class OhMyModelController {
    public static var shared = OhMyModelController()
    let modelContainer: ModelContainer
    let workContext: ModelContext
    
    public init() {
        let schema: Schema = Schema([TestModelClass.self])
        let inMemory: Bool = Configuration.mode == .unitTesting ? true : false
        let modelConfiguration = ModelConfiguration(Configuration.mode.rawValue, inMemory: inMemory, readOnly: false, sharedAppContainerIdentifier: Configuration.appGroupName, cloudKitContainerIdentifier: Configuration.cloudKitContainerIdentifier)
        self.modelContainer = try! ModelContainer(for: schema, configurations: [modelConfiguration])
        self.workContext = ModelContext(self.modelContainer)
    }
}

下面是我添加或删除的方式(使用环境中容器的主上下文或我在控制器中创建的workContext):

public func create(_ context: ModelContext?) {
        let contextToUse: ModelContext = context != nil ? context! : workContext
        contextToUse.insert(object: TestModelClass(name: "Test"))
        try? contextToUse.save()
    }
    
    public func delete(_ test: TestModelClass, on context: ModelContext?) {
        let contextToUse: ModelContext = context != nil ? context! : workContext
        contextToUse.delete(test)
        try? contextToUse.save()
    }

下面是我用于测试的视图:

struct SwiftDataTest: View {
    @Environment(\.modelController) var modelController: OhMyModelController
    @Environment(\.modelContext) var modelContext: ModelContext
    @Query() var tests: [TestModelClass]
    var body: some View {
        VStack {
            List {
                ForEach(tests) { test in
                    Text(test.name)
                        .onTapGesture(perform: {
                            modelController.delete(test, on: modelContext)
                        })
                }
            }
            Button(action: {
                modelController.create(modelContext)
            }, label: {
                Text("Testers will test!")
            })
        }
    }
}

在@Environment modelContext和workContext上插入和删除工作,它们只是没有保持彼此最新。SwiftData是否有与automaticallyMergesChangesFromParent等效的功能?这似乎很奇怪,认为一切都是如此容易,但然后我将不得不手动跟踪和合并更改使用保存通知?

nhhxz33t

nhhxz33t1#

使用@ModelActor代替@Observable,并包含一些可以从.task调用的异步函数,从WWDC 23休息室:
WWDC Bot APP 8天前@邓肯问:据我所知,SwiftData模型对象不是线程安全的,就像NSManagedObjects一样。是否有任何额外的机制,使我们更容易管理这比在传统的核心数据?例如,在将对象传递出其上下文之前,编译器警告?2回复
WWDC Bot APP 8天前@Dave N(Apple)回答:我们提供了ModelActor协议和DefaultModelExecutor,使SwiftData与Swift并发一起工作。使用ModelContainer在ModelActor一致性actor对象的初始化器中初始化ModelContext,并使用该上下文初始化DefaultModelExecutor。这将允许您在actor上使用带有异步函数的上下文。See less:2:+1::skin-tone-2:1
Ben T(Apple)8天前Swift将强制执行可发送性要求
从Xcode 15 beta 1开始,@Query不会更新,直到您重新启动应用程序或重新访问屏幕才能看到您的更改。

相关问题