如何解决在 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()
}
}
,
您可以将您正在执行的函数或作品放在视图的初始化中,放在类/模式的初始化中l。永远不要将 View init 用于此类作品,SwiftUI 只是在它认为必须的任何时候到处初始化视图,所以永远不要这样做。
即使您可以定义控制某些数据的条件!这是错误的代码设计!
你也可以设置一个条件,让你的视图等待你的类开始渲染。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。