Просмотр метода viewDidLoad контроллера до завершения applicationDidFinishLaunching - PullRequest
2 голосов
/ 13 марта 2010

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 13 марта 2010

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

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

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

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

0 голосов
/ 13 марта 2010

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

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

...