Завершение метода viewDidLoad контроллера представления перед applicationDidFinishLaunching
-
19-09-2019 - |
Вопрос
Я создаю довольно сложное приложение для iPhone, используя Core Data.До сих пор все шло нормально.Однако по мере того, как приложение становилось все более сложным, возникла новая проблема:первый контроллер представления завершает свой метод viewDidLoad до того, как AppDelegate пройдет хотя бы половину своего метода applicationDidFinishLaunching.
Контроллер представления не является корнем, который является контроллером панели вкладок.Речь идет о виртуальной вкладке, выбранной по умолчанию на панели вкладок.IB создает его экземпляр.
По моему опыту, ничего подобного раньше не случалось, и это отбрасывает важную инициализацию, которую я делаю в AppDelegate (получение объектов из Core Data и подготовка их к использованию).Более того, это происходит с перерывами — иногда делегат делает закончить первым.
Кто-нибудь еще замечал подобную трудность?Есть ли пример кода, который решает такую проблему?
Я предполагаю, что ответ заключается в том, чтобы заставить VC загружать данные, которые готовит AppDelegate, только тогда, когда AppDelegate отправляет сообщение о своей готовности.Я немного обеспокоен тем, что это добавляет что-то, что в конечном итоге укусит меня за задницу позже.
Решение
Решение, которое я использую, чтобы избежать подобных состояний гонки, состоит в том, чтобы полностью отказаться от ссылок на любой функциональный пользовательский интерфейс приложения до тех пор, пока данные не будут загружены и проверены.В верхней части моего приложенияDidFinishLaunching:метод, я делаю следующее:
- Создайте UIWindow с подпредставлением:
- UIImageView Default.png с подпредставлением:
- UIActivityIndicatorView, центрированный в кадре (и анимация)
- UIImageView Default.png с подпредставлением:
- Установите ключ окна и видимость, чтобы пользователь как можно скорее получал визуальную информацию о том, что некоторая обработка данных происходит до загрузки пользовательского интерфейса.
- Выполните загрузку и проверку всех ваших данных (которые могут включать сетевую активность).
- Создайте и добавьте основное представление пользовательского интерфейса в окно в качестве подпредставления прямо под представлением Default.png, которое затем затемняется и удаляется из суперпредставления.
То, как вы реализуете шаг 4 (вызов подпрограммы, асинхронное уведомление, наблюдение за значением ключа и т. д.), полностью зависит от вас.Что важно, так это идея поставить загрузку любых компонентов пользовательского интерфейса в зависимость от загрузки любых необходимых компонентов данных.
Это позволяет вам писать весь свой код пользовательского интерфейса, не беспокоясь о данных, что вы в любом случае хотите делать в приложении MVC.
Другие советы
После завершения инициализации делегата приложения запустите NSNotification
— это будет последнее, что applicationDidFinishLaunching
метод, по-видимому, подойдет.
Попросите того же делегата приложения прослушать это уведомление и запустить селектор, скажем loadViewController
, который затем загружает контроллер представления.