在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?

Posted

技术标签:

【中文标题】在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?【英文标题】:How we can run some logic stand alone from Views before SwiftUI start rendering ContentView? 【发布时间】:2020-11-04 10:07:37 【问题描述】:

我想知道如何在 SwiftUI 尝试渲染 ContentView 之前运行一些逻辑函数或控制流运算符?我可以在哪里以及如何放置我的代码?

更新:init() var body: some Scene

之前

当我使用 init 并在那里执行我的逻辑时,我找不到报告我的过程结果的方法,我该如何解决这个问题?

我的代码:

    import SwiftUI

@main
struct _99App: App

    init() 
        let firstName = "omid"
        print(firstName)
    
    
    @State var name : String = firstName // ← Here        Error: Cannot find 'firstName' in scope
    
    
    var body: some Scene 

        WindowGroup 
            
            ContentView(name: $name)
                
        
 
        
        
    

PS:基本上我需要一个地方在应用程序发生任何事情之前运行我的逻辑。

【问题讨论】:

这是否回答了您的问题***.com/a/63525968/12299030? 【参考方案1】:

您可以使用某种ObservableObject 作为StateObject,它将在其他所有内容之前初始化。

所以解决方案可能如下所示

let globalState = MyAppState()

@main
struct _99App: App

    @StateObject var appState = globalState
    
    init() 
       globalState.firstName = "updated"
        print("updated")
    

    var body: some Scene 
        WindowGroup 
            ContentView().environmentObject(appState)
            // and use as
            // @EnvironmentObject var appState: MyAppState
            // inside ContentView
        
    


class MyAppState: ObservableObject 
    @Published var firstName: String
    
    init() 
        self.firstName = "omid"
        print(firstName)
    

【讨论】:

如果你把这段代码 init() print("⌘") *** before ***var body: some Scene你会看到它的运行速度比 MyAppState-Class 快,MyAppState 的运行时间几乎与 ContentView 相同,事实上它们是同时发生的,就像多米诺骨牌一样,但我希望代码在应用程序中运行的第一位置!正如您将看到的 ⌘ 的符号总是首先打印,并且比 print(firstName) 更快,我想根据我的逻辑得到那个地方。

以上是关于在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

AppDelegate 和 ContentView() 之间的 SwiftUI 通信

蓝牙扫描启动 SwiftUI 后渲染列表

swiftui 请求 渲染数据

Swiftui - Apple Watch 上的金属渲染

如何在 SwiftUI 中实现 MVVM 模式?视图不会重新渲染

SwiftUI:避免使用 MKMapView+UIViewRepresentable 在 TabView 中重新创建/重新渲染视图