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。这里发生了什么以及在应用程序启动时初始化多个异步函数的正确方法是什么,例如:
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)
| 归档时间: |
|
| 查看次数: |
6574 次 |
| 最近记录: |