使用异步函数初始化应用 |斯威夫特用户界面

Initialize app with an Async function | SwiftUI

我需要我的应用程序在启动时配置后端,这是执行此操作的函数:

// Initializes Amplify
final func configureAmplify() async {
    do {
//            Amplify.Logging.logLevel = .info
        let dataStore = AWSDataStorePlugin(modelRegistration: AmplifyModels())
        let syncWithCloud = AWSAPIPlugin()
        let userAuth = AWSCognitoAuthPlugin()

        try Amplify.add(plugin: userAuth)
        try Amplify.add(plugin: dataStore)
        try Amplify.add(plugin: syncWithCloud)
        try Amplify.configure()
        print("Amplify initialized")
    } catch {
        print("Failed to initialize Amplify with \(error)")
    }
}

我试过像这样将它放在@main init 中:

init() async {
    await networkController.configureAmplify()
}

但我收到以下错误:

Type 'MyApplicationNameApp' does not conform to protocol 'App'

我尝试在初始化之后应用建议:

init() {
        
}

但这看起来很奇怪,所以现在我有 2 个初始化。这里发生了什么以及在应用程序启动时初始化多个异步函数的正确方法是什么,示例:

  1. 上面的代码(配置放大)
  2. 检查用户是否登录
  3. 设置会话

等等

注意:init() async 在上面的示例中从未被调用,这是这个问题中的另一个问题,那么在应用程序启动时初始化异步函数的正确方法是什么。

使用ViewModifier

.task{
    await networkController.configureAmplify()
}

您可以将 Task 添加到 init,但您可能会遇到问题,因为 SwiftUI 可以根据需要重新创建 View

init(){
    Task(priority: .medium){
        await networkController.configureAmplify()
    }
}

或者您可以使用 ObservableObject@StateObject

With an @StateObject SwiftUI creates a new instance of the object only once for each instance of the structure that declares the object.

https://developer.apple.com/documentation/swiftui/stateobject

@main
struct YourApp: App {
    @StateObject var networkController: NetworkController = NetworkController()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
class NetworkController: ObservableObject{
    
    init() {
        Task(priority: .medium){
            await configureAmplify()
        }
    }
    // Initializes Amplify
    final func configureAmplify() async {
        do {
            //            Amplify.Logging.logLevel = .info
            let dataStore = AWSDataStorePlugin(modelRegistration: AmplifyModels())
            let syncWithCloud = AWSAPIPlugin()
            let userAuth = AWSCognitoAuthPlugin()
            
            try Amplify.add(plugin: userAuth)
            try Amplify.add(plugin: dataStore)
            try Amplify.add(plugin: syncWithCloud)
            try Amplify.configure()
            print("Amplify initialized")
        } catch {
            print("Failed to initialize Amplify with \(error)")
        }
    }
}