Вы не можете остановить контроллер представления от «запуска» самого себя (за исключением того, чтобы вообще не нажимать / представлять / показывать его). Как только вы нажимаете / представляете / показываете его, его жизненный цикл не может и не должен быть остановлен. Поэтому вы несете ответственность за загрузку соответствующего пользовательского интерфейса для «состояния загрузки», который может быть контроллером с пустым представлением с загрузчиком. Вы можете сделать это как хотите, включая загрузку полного пользовательского интерфейса с .isHidden = true
, установленным для всех объектов просмотра. Идея состоит в том, чтобы сделать как можно больше предварительной загрузки пользовательского интерфейса, пока база данных работает в фоновом режиме, чтобы, когда данные были готовы, вы могли отобразить полный пользовательский интерфейс с наименьшим количеством работы.
Я рекомендую после того, как вы загрузили пользовательский интерфейс в его «загрузочной» конфигурации, загрузите данные как последний шаг в вашем потоке и используйте обработчик завершения, чтобы завершить sh задачу:
override func viewDidLoad() {
super.viewDidLoad()
loadData { (result) in
// load full UI
}
}
Ваш метод данных может выглядеть примерно так:
private func loadData(completion: @escaping (_ result: Result) -> Void) {
...
}
РЕДАКТИРОВАТЬ
Рассмотрите возможность создания менеджера данных, который работает по следующим направлениям. Поскольку менеджер данных является классом (ссылочным типом), при передаче его другим контроллерам представления все они указывают на один и тот же экземпляр менеджера. Следовательно, изменения, которые любой из контроллеров представления вносит в него, видны другими контроллерами представления. Это означает, что когда вы используете sh новый контроллер представления и пора обновить метку, получите доступ к ней из свойства data
. А если он не готов, подождите, пока менеджер данных не уведомит контроллер представления о готовности.
class GameDataManager {
// stores game properties
// updates game properties
// does all thing game data
var score = 0
var word: String?
}
class MainViewController: UIViewController {
let data = GameDataManager()
override func viewDidLoad() {
super.viewDidLoad()
// when you push to another view controller, point it to the data manager
let someVC = SomeOtherViewController()
someVC.data = data
}
}
class SomeOtherViewController: UIViewController {
var data: GameDataManager?
override func viewDidLoad() {
super.viewDidLoad()
if let word = data?.word {
print(word)
}
}
}
class AnyViewController: UIViewController {
var data: GameDataManager?
}