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