![](/img/trans.png)
[英]How can I use async/await with SwiftUI in Swift 5.5?
[英]Can I use Swift async/await to call void methods in succession?
在 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()
}
你可以嘗試這樣的事情:
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)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.