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

Art*_*uro 4 swiftui swiftui-environment

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

// 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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试将它放在 @main init 中,如下所示:

init() async {
    await networkController.configureAmplify()
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

Type 'MyApplicationNameApp' does not conform to protocol 'App'
Run Code Online (Sandbox Code Playgroud)

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

init() {
        
}
Run Code Online (Sandbox Code Playgroud)

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

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

ETC

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

lor*_*sum 12

使用ViewModifier

.task{
    await networkController.configureAmplify()
}
Run Code Online (Sandbox Code Playgroud)

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

init(){
    Task(priority: .medium){
        await networkController.configureAmplify()
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用ObservableObject一个@StateObject

对于@StateObjectSwiftUI,只需为声明该对象的结构的每个实例创建一次该对象的新实例。

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)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)