从Firebase实时数据库中获取数据后,我试图关闭显示加载指示器的视图控制器。
从嵌入在导航控制器中的主视图控制器推送处理数据的视图控制器,并在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是一个带有加载指示器的视图控制器,它是从笔尖初始化的:
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
is a view controller that is presented by the view controller。