我正在用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等效的功能?这似乎很奇怪,认为一切都是如此容易,但然后我将不得不手动跟踪和合并更改使用保存通知?
1条答案
按热度按时间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
不会更新,直到您重新启动应用程序或重新访问屏幕才能看到您的更改。