Увольнение «загрузочного» контроллера вида из обработчика завершения Firebase не работает - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь отключить контроллер представления, который показывает индикатор загрузки, после того, как данные извлечены из базы данных 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 - это контроллер вида, представленный контроллером вида .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...