繁体   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