#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, это результат…
Кнопка «Дополнительная покупка билета» появляется на долю секунды. Даже несмотря на то, что это очень быстро, вы все равно можете это увидеть, и это просто не то, что пользователю нужно было бы видеть. Это также наоборот, когда вы нажимаете на ячейку, которая не куплена, две нижние кнопки отображаются на долю секунды. Я просто хочу знать, как я могу предотвратить эту быструю ошибку и иметь возможность отображать плавный переход без задержек при скрытии кнопки. Спасибо.
Ответ №1:
getDocuments
это асинхронная функция, то есть она не вызывает свою функцию обратного вызова немедленно-она вызывает ее, когда получает данные с сервера. Это может показаться долей секунды только потому, что ваше интернет-соединение быстрое, а серверы Firebase определенно быстрые, но это ненулевое время наверняка. И у кого-то с более медленным подключением может возникнуть гораздо большая задержка.
Если ваш обратный вызов не вызывается дважды с разными результатами (что кажется сомнительным), единственное решение здесь-убедиться, что в вашем начальном состоянии скрыты все кнопки (и, возможно, индикатор загрузки), а затем показать нужные кнопки, как только вы получите данные обратно (как сейчас). Однако я предполагаю, что у вас есть начальное состояние, в котором видны кнопки, что вызывает мерцание.