调用SwiftUI View和ObservableObject的init()中的函数



所以我有一些数据抓取任务的视图(类型:View),需要在视图加载后立即运行。如果我把它们放在.onAppear{}中,它们不会在正确的时间加载。所以我必须把它们放在结构体的init(){}块中。

另外,我有从视图模型获取数据的任务。这些也需要立即运行,如果我在.onAppear{}中调用它们,就太晚了,程序不会加载数据。所以我把这些函数也放在init(){}块中。

问题在这里。它初始化了很多次。我在Firestore上每天有3K的阅读量,我是唯一一个使用该应用程序的人。当我连接我的语音聊天应用程序时,它加入了init(){}频道,但后来它试图加入它像17次。

所以我的问题是:我如何调用一个函数同时视图的初始化,但确保它只运行一次每次加载视图?

下面是我的代码中的一些示例,以进一步了解

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()
}
}

你可以把你的函数或作品放在你的View的init放在你的class/mode的initl.永远不要在这种工作中使用视图初始化,SwiftUI只是在这里和那里初始化视图,任何时候它认为它必须,所以永远不要这样做.

即使你可以定义一个条件来控制一些数据!这是错误的代码设计!

你可以设置一个条件,让你的视图等待你的类开始渲染。

最新更新