我试图将所有数据库操作放到后台。 对于功能,我需要恢复设置。
if let showMessage = dataManager.getSetting(key: "showWelcomeMessage", modelContext: modelContext) {
if showMessage == "true" {
showWelcomeMessage = true
} else {
showWelcomeMessage = false
}
}
DataManager 中的功能是:
func getSetting(key: String) -> String? {
let task = Task {
await DataActor.shared.getSetting(key: key)
}
// return await task.value
}
DataManager 是一个方便的类,可让我访问执行查找的 @ModelActor DataActor。
func getSetting(key: String) -> String? {
do {
let predicate = #Predicate<Setting> { object in
object.key == key
}
var descriptor = FetchDescriptor(predicate: predicate)
descriptor.fetchLimit = 1
let object = try modelContext.fetch(descriptor)
if let setting = object.first {
// print("Found setting \(key) with value \(setting.value)")
return setting.value
}
} catch {
debugPrint("Failed to get object: \(error)")
}
return nil
}
有没有一种简单的方法可以在视图中检索此字符串,如第一个代码片段所示?
假设
showWelcomeMessage
是 @State
,并且第一个代码片段位于 View
中,您可以将代码放在 .task { ... }
修饰符中。然后您只需 await
getString
通话即可。您不应该同步获取字符串。
SomeViewContent()
.task {
if let showMessage = await DataActor.shared.getSetting(key: key) {
showWelcomeMessage = showMessage == "true"
}
}
这将在视图首次出现时运行。如果您还想稍后运行它,请使用
.task(id: someTrigger) { ... }
。当 someTrigger
发生变化时,任务将再次运行。