Завершение метода viewDidLoad контроллера представления перед applicationDidFinishLaunching

StackOverflow https://stackoverflow.com/questions/2436317

Вопрос

Я создаю довольно сложное приложение для iPhone, используя Core Data.До сих пор все шло нормально.Однако по мере того, как приложение становилось все более сложным, возникла новая проблема:первый контроллер представления завершает свой метод viewDidLoad до того, как AppDelegate пройдет хотя бы половину своего метода applicationDidFinishLaunching.

Контроллер представления не является корнем, который является контроллером панели вкладок.Речь идет о виртуальной вкладке, выбранной по умолчанию на панели вкладок.IB создает его экземпляр.

По моему опыту, ничего подобного раньше не случалось, и это отбрасывает важную инициализацию, которую я делаю в AppDelegate (получение объектов из Core Data и подготовка их к использованию).Более того, это происходит с перерывами — иногда делегат делает закончить первым.

Кто-нибудь еще замечал подобную трудность?Есть ли пример кода, который решает такую ​​проблему?

Я предполагаю, что ответ заключается в том, чтобы заставить VC загружать данные, которые готовит AppDelegate, только тогда, когда AppDelegate отправляет сообщение о своей готовности.Я немного обеспокоен тем, что это добавляет что-то, что в конечном итоге укусит меня за задницу позже.

Это было полезно?

Решение

Решение, которое я использую, чтобы избежать подобных состояний гонки, состоит в том, чтобы полностью отказаться от ссылок на любой функциональный пользовательский интерфейс приложения до тех пор, пока данные не будут загружены и проверены.В верхней части моего приложенияDidFinishLaunching:метод, я делаю следующее:

  1. Создайте UIWindow с подпредставлением:
    • UIImageView Default.png с подпредставлением:
      • UIActivityIndicatorView, центрированный в кадре (и анимация)
  2. Установите ключ окна и видимость, чтобы пользователь как можно скорее получал визуальную информацию о том, что некоторая обработка данных происходит до загрузки пользовательского интерфейса.
  3. Выполните загрузку и проверку всех ваших данных (которые могут включать сетевую активность).
  4. Создайте и добавьте основное представление пользовательского интерфейса в окно в качестве подпредставления прямо под представлением Default.png, которое затем затемняется и удаляется из суперпредставления.

То, как вы реализуете шаг 4 (вызов подпрограммы, асинхронное уведомление, наблюдение за значением ключа и т. д.), полностью зависит от вас.Что важно, так это идея поставить загрузку любых компонентов пользовательского интерфейса в зависимость от загрузки любых необходимых компонентов данных.

Это позволяет вам писать весь свой код пользовательского интерфейса, не беспокоясь о данных, что вы в любом случае хотите делать в приложении MVC.

Другие советы

После завершения инициализации делегата приложения запустите NSNotification — это будет последнее, что applicationDidFinishLaunching метод, по-видимому, подойдет.

Попросите того же делегата приложения прослушать это уведомление и запустить селектор, скажем loadViewController, который затем загружает контроллер представления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top