代码之家  ›  专栏  ›  技术社区  ›  Luuk D. Jansen

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

  •  0
  • Luuk D. Jansen  · 技术社区  · 3 月前

    我正试图将我所有的数据库操作放到后台。 对于功能,我需要一个背景。

    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
    }
    

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

    1 回复  |  直到 3 月前
        1
  •  0
  •   Sweeper    3 月前

    假设 showWelcomeMessage 是a @State ,并且第一个代码片段位于 View ,您可以将代码放入 .task { ... } 改性剂。那你就可以 await 这个 getString 电话。您不应该同步获取字符串。

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

    这将在视图首次出现时运行。如果您还想稍后运行它,请使用 .task(id: someTrigger) { ... } 。任务将在以下时间再次运行 someTrigger 变化。