簡體   English   中英

在 SwiftUI View 和 ObservableObject 的 init() 中調用函數

[英]Calling functions in init() of SwiftUI View and ObservableObject

因此,我有一些視圖數據獲取任務(類型: View )需要在視圖加載后立即運行。 如果我將它們放在.onAppear{}中,它們不會在正確的時間加載。 所以我必須把它們放在結構的init(){}塊中。

此外,我還有從視圖模型中獲取數據的任務。 這些也需要立即運行,如果我在.onAppear{}中調用它們,則為時已晚,程序不會加載數據。 所以我也把這些函數放在了init(){}塊中。

這就是問題所在。 它初始化了很多次。 我每天在 Firestore 上閱讀 3K,我是唯一一個使用該應用程序的人。 當我連接我的語音聊天應用程序時,它會在init(){}上加入頻道,但隨后它會嘗試再加入 17 次。

所以我的問題是:如何在視圖初始化的同時調用 function,但要確保每次加載視圖時它只運行一次?

這是我的代碼中的一些示例,以提供進一步的見解

struct VoiceChatView: View {
    @State var halfModalShown = false
    @State var settingsModalShown = false
    @Binding var topic : Topic
    @State var channel : Channel
    
    @State var isLocalAudioMuted = false
    private let audioEngine = AudioEngine()
    private var rtcEngine: AgoraRtcEngineKit {
        get {
            return audioEngine.agoraKit
        }
    }
    
    @State var currentUser = AuthViewModel.shared.user!
    
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
    init(topic: Binding<Topic>, channel: Channel) {
        self._topic = topic
        self._channel = State(initialValue: channel)
        self.callOnce()
    }


    var body: some View {
        Text("Hello, world")
    }
}

如果您查看callOnce()您會注意到它被多次調用。 我需要在發生其他任何事情之前調用它,是的。 但我需要它不要不斷地一遍又一遍地打電話。

你能試試init方法中的措辭嗎

   init(topic: Binding<Topic>, channel: Channel) {
            self._topic = topic
            self._channel = State(initialValue: channel)
//            self.callOnce()
        if self._channel {
            self.callOnce()
        }
        }

你可以把你的 function 或你正在做的工作放在你的 View的 init ,你的類/模式l 的 init 中。 永遠不要將 View init 用於此類工作,SwiftUI 只是在這里和那里以及它認為必須的任何時候初始化 View,所以永遠不要這樣做

即使您可以定義控制某些數據的條件! 這是錯誤的代碼設計!

您可以設置一個條件,即您的視圖等待您的 class 開始渲染以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM