[英]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.