从Firebase完成处理程序中关闭“正在加载”视图控制器不起作用

时间:2019-07-06 22:49:40

标签: ios swift firebase firebase-realtime-database uiviewcontroller

从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,但是将其移到viewWillAppearviewDidAppear上是行不通的。 在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

0 个答案:

没有答案