0

在 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()
}
4

1 回答 1

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)
    }
}
于 2021-10-25T04:24:06.353 回答