swiftui - 使用异步函数初始化应用程序 | 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 个 init。这里发生了什么以及在应用程序启动时初始化多个异步函数的正确方法是什么,例如:
- 上面的代码(配置放大)
- 检查用户是否登录
- 设置会话
ETC
注意:init() async
在上面的示例中永远不会被调用,这是这个问题中的另一个问题,那么在应用程序启动时初始化异步函数的正确方法是什么。
解决方案
使用ViewModifier
.task{
await networkController.configureAmplify()
}
您可以添加一个Task
,但您可能会遇到问题,因为 SwiftUI 可以根据需要init
重新创建View
init(){
Task(priority: .medium){
await networkController.configureAmplify()
}
}
ObservableObject
或者您可以使用@StateObject
对于
@StateObject
声明对象的结构的每个实例,SwiftUI 只创建一次对象的新实例。
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)")
}
}
}
推荐阅读
- node.js - 通过 apollo graphlql 服务器传递 httponly cookie
- go - HTTP 中间件和谷歌云函数
- php - How to reliably split a string into multiple variables using PHP
- angular - 即使事件相同,也要调用 ngModelChange
- client - 如何解决三层NAT的P2P连接问题
- mysql - 如何计算nodejs中每个帖子的评论总数,react js和sequelize?
- java - 如何快速找到多个字符串中为空或为空的字符串
- c# - Sending Int32 equal to 4, received as equal to 67108864
- python - Keras 权重约束同时包括偏差和核矩阵
- rspec - 如何配置 Rubymine 以使用我们的文件夹结构?