【问题标题】:Can I use Swift async/await to call void methods in succession?我可以使用 Swift async/await 来连续调用 void 方法吗?
【发布时间】:2021-12-10 14:37:46
【问题描述】:

在 ViewModel 中,我目前正在使用回调 1. 进行 API 调用并设置 data1,2. 在第二个 API 调用中使用 data1 来设置 data2,然后在第三个函数中使用 data2 来解析和设置已发布的要在视图中使用的值。

到目前为止,我看到的示例都是基于等待返回值。我只想连续运行 void 函数。我已经尝试实现以下概念,但我不断收到“不支持并发的函数中的异步”。

// ViewModel

var data1:Data?
var data2:Data?
@Published var myString:String?

func getFirstData() async -> Void {
  data1 = someAPIrequest()
}

func getSecondData() async -> Void {
  data2 = anotherAPIrequest(await data1)
}

func setViewString() {
  myString = data2!.name
}

// View

var body: some View {
  Text(await model.myString)
}.onAppear{
  getFirstData()
  getSecondData()
}

【问题讨论】:

    标签: swift async-await swiftui ios15 swift5.5


    【解决方案1】:

    你可以试试这样的:

    import SwiftUI
    
    @main
    struct TestApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    
    struct ContentView: View {
        @StateObject var model = MyDataModel()
        
        var body: some View {
            Text(model.myString ?? "")
                .task {
                    await model.getFirstData()
                    await model.getSecondData() // will wait for getFirstData to finish
                    model.setViewString() // will wait for getSecondData to finish
                }
        }
    }
    
    class MyDataModel: ObservableObject {
        var data1: Data?
        var data2: Data?
        
        @Published var myString: String?
        
        func getFirstData() async -> Void {
            // just for testing
            self.data1 = "data1-data1-data1".data(using: .utf8)  // someAPIrequest()
        }
        
        func getSecondData() async -> Void {
            // just for testing
            data2 = data1  // anotherAPIrequest(data1)
        }
        
        func setViewString() {
            // just for testing
            myString = String(data: data2!, encoding: .utf8)
        }
    }
    

    【讨论】:

    • 您已经隐藏了答案中最重要的部分,即.task { 修饰符本质上是onAppear,但它创建了一个异步上下文。
    • 我应该发掘我的.task{...} 吗?
    • 是的!这是您答案的有用部分,它回答了实际问题:)
    • 我的评论是,如何让.task{...} 比我之前展示的更突出。
    • 您可以在答案中添加一些文字,解释问题是什么以及如何解决它,目前您有代码但没有解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2015-12-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2021-04-18
    • 2021-10-02
    相关资源
    最近更新 更多