как предотвратить появление кнопки на долю секунды при загрузке представления

#ios #swift #uiviewcontroller #uibutton #viewwillappear

Вопрос:

Поэтому моя цель-плавно загрузить 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
            }
        }
    }

}
 

Я вызываю эту функцию в viewWillAppear() vc, но когда я создаю экземпляр для этого vc, это результат…

ошибка vc

Кнопка «Дополнительная покупка билета» появляется на долю секунды. Даже несмотря на то, что это очень быстро, вы все равно можете это увидеть, и это просто не то, что пользователю нужно было бы видеть. Это также наоборот, когда вы нажимаете на ячейку, которая не куплена, две нижние кнопки отображаются на долю секунды. Я просто хочу знать, как я могу предотвратить эту быструю ошибку и иметь возможность отображать плавный переход без задержек при скрытии кнопки. Спасибо.

Ответ №1:

getDocuments это асинхронная функция, то есть она не вызывает свою функцию обратного вызова немедленно-она вызывает ее, когда получает данные с сервера. Это может показаться долей секунды только потому, что ваше интернет-соединение быстрое, а серверы Firebase определенно быстрые, но это ненулевое время наверняка. И у кого-то с более медленным подключением может возникнуть гораздо большая задержка.

Если ваш обратный вызов не вызывается дважды с разными результатами (что кажется сомнительным), единственное решение здесь-убедиться, что в вашем начальном состоянии скрыты все кнопки (и, возможно, индикатор загрузки), а затем показать нужные кнопки, как только вы получите данные обратно (как сейчас). Однако я предполагаю, что у вас есть начальное состояние, в котором видны кнопки, что вызывает мерцание.