简体   繁体   中英

Can I use Swift async/await to call void methods in succession?

In a ViewModel, I'm currently using callbacks to 1. make an API call and set data1, 2. use data1 in a second API call to set data2, then use data2 in a third function to parse and set a published value to be used in a View.

The examples I've seen so far have been based on awaiting return values. I only want to run void functions in succession. I've tried implementing the concept below but I keep getting "async in a function that does not support concurrency".

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

you could try something like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM