我可以使用Swift async/await连续调用void方法吗?



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

到目前为止,我看到的示例都是基于等待返回值的。我只想连续运行void函数。我试着实现下面的概念,但我总是得到"async"在一个函数中,不支持并发。
// 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()
}

你可以尝试这样做:

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)
}
}

相关内容

  • 没有找到相关文章

最新更新