如何防止按钮在视图加载时出现瞬间

how to prevent button showing up for split second when view loads

所以我的目标是顺利加载 viewController,没有瞬间错误。我有一个函数,用于确定在基于 Firestore 文档中的字段加载视图时显示哪些按钮。这是函数:

func determinePurchasedStatusVerification() {
    db.collection("student_users/\(user?.uid)/events_bought").whereField("event_name", isEqualTo: selectedEventName!).whereField("isEventPurchased", isEqualTo: true).getDocuments { (querySnapshot, error) in
        if let error = error {
            print("\(error)")
        } else {
            guard let querySnap = querySnapshot?.isEmpty else { return }
            if querySnap == true {
                self.purchaseTicketButton.isHidden = false
                self.viewPurchaseButton.isHidden = true
                self.cancelPurchaseButton.isHidden = true
            } else {
                self.purchaseTicketButton.isHidden = true
                self.viewPurchaseButton.isHidden = false
                self.cancelPurchaseButton.isHidden = false
            }
        }
    }

}

我在 vc 的 viewWillAppear() 中调用了这个函数,但是当我实例化到那个 vc 时,这就是结果...

补购票按钮瞬间出现。尽管速度非常快,但您仍然可以看到它,而且用户不需要看到它。反之亦然,当您单击未购买的单元格时,底部的两个按钮会瞬间显示。我只是想知道如何防止这个快速错误并能够显示平滑的 segue 而不会延迟按钮隐藏。谢谢

getDocuments 是一个异步函数,这意味着它不会立即调用其回调函数——它会在从服务器取回数据时调用它。这似乎是一瞬间,因为您的互联网连接速度很快,而且 Firebase 服务器绝对 很快,但这肯定不是零时间。而且,连接速度较慢的人可能会遇到 多得多的延迟。

除非您的回调被调用两次并得到不同的结果(这似乎值得怀疑),否则这里唯一的解决方案是确保您的初始状态隐藏了所有按钮(可能还有一个加载指示器),然后显示取回数据后所需的按钮(就像现在一样)。不过,我的猜测是,您有一个初始状态,其中按钮 可见的,这会导致闪烁。