Я пытаюсь отключить контроллер представления, который показывает индикатор загрузки, после того, как данные извлечены из базы данных Firebase Realtime.Контроллер представления, который обрабатывает данные, передается из контроллера основного представления, встроенного в контроллер навигации, и он представляет загружаемый контроллер представления в методе viewDidLoad
.
Я пытался отправить метод dismiss
восновная очередь, но она не работает.
import UIKit
import FirebaseDatabase
class DetailViewController: UIViewController {
private var ref: DatabaseReference!
private var handle: DatabaseHandle!
override func viewDidLoad() {
super.viewDidLoad()
ref = Database.database().reference(withPath: "path")
present(LoadingViewController(), animated: true)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
handle = ref.observe(.value) { snapshot in
// Some logic
DispatchQueue.main.async {
self.presentedViewController?.dismiss(animated: false)
}
}
}
}
Странно, когда я отлаживаю с помощью Xcode, сначала выполняется метод present
, но на самом деле он не отображает контроллер представления загрузки и dismiss
Метод выполняется первым.Я попытался добавить блок завершения в метод present
, чтобы явно отключить его сам при вызове dismiss
ранее, но данные уже получены.Однако логику проверки извлекаемых данных сложно проверить в моем случае, и это не кажется идеальным решением.
Возможно, проблема present
в пределах viewDidLoad
, но ее перемещениедо viewWillAppear
или viewDidAppear
не работает.Процесс перемещения данных в viewDidAppear
работает, но замедляет его.
(Правка)
LoadingViewController - это контроллер представления с индикатором загрузки, который инициализируется из nib:
class LoadingViewController: UIViewController {
private var loadingImages: [UIImage] = [...]
private var count = 0
// An outlet from xib
@IBOutlet weak var loadingImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(withTimeInterval: 1.0 / Double(loadingImages.count),
repeats: true) { _ in
self.loadingImageView.image = self.loadingImages[self.count]
self.count = (self.count + 1) % self.loadingImages.count
}
}
override private init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
modalPresentationStyle = .overCurrentContext
modalTransitionStyle = .crossDissolve
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
и presentedViewController
- это контроллер вида, представленный контроллером вида .