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


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

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

Ничего подобного раньше в моем опыте не происходило, и это отбрасывает важную инициализацию, которую я делаю в AppDelegate (получение объектов из основных данных и подготовка их к использованию) . Кроме того, он прерывистый - иногда делегат делает финиш первым.

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

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

2 2

2 ответа:

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

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

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

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

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

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