可以用Swiftasync/await连续调用void方法吗?
Can I use Swift async/await to call void methods in succession?
在 ViewModel 中,我目前正在使用回调来 1. 进行 API 调用并设置 data1,2. 在第二个 API 调用中使用 data1 来设置 data2,然后使用 data2在第三个函数中解析和设置要在视图中使用的已发布值。
到目前为止,我看到的示例都是基于等待 return 值。我只想连续 运行 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()
}
你可以尝试这样的事情:
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)
}
}
在 ViewModel 中,我目前正在使用回调来 1. 进行 API 调用并设置 data1,2. 在第二个 API 调用中使用 data1 来设置 data2,然后使用 data2在第三个函数中解析和设置要在视图中使用的已发布值。
到目前为止,我看到的示例都是基于等待 return 值。我只想连续 运行 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()
}
你可以尝试这样的事情:
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)
}
}