簡體   English   中英

我可以使用 Swift async/await 連續調用 void 方法嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM