从任务同步或异步返回字符串值

问题描述 投票:0回答:1

我试图将所有数据库操作放到后台。 对于功能,我需要恢复设置。

                    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 {
        return 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
}

有没有一种简单的方法可以在视图中检索此字符串,如第一个代码片段所示?

swiftui
1个回答
0
投票

假设

showWelcomeMessage
@State
,并且第一个代码片段位于
View
中,您可以将代码放在
.task { ... }
修饰符中。然后您只需
await
getString
通话即可。您不应该同步获取字符串。

SomeViewContent()
    .task {
        if let showMessage = await DataActor.shared.getSetting(key: key) {
            showWelcomeMessage = showMessage == "true"
        }
    }

这将在视图首次出现时运行。如果您还想稍后运行它,请使用

.task(id: someTrigger) { ... }
。当
someTrigger
发生变化时,任务将再次运行。

© www.soinside.com 2019 - 2024. All rights reserved.