Стратегия для запуска задачи - и избегать условий гонки - от App Delegate
Я разрабатываю небольшое приложение поверх основных данных. При запуске мне нужно запустить задачу обслуживания - быстро, но важно -. Для выполнения этой задачи делегат приложения должен открыть UIManagedDocument и выполнить различные проверки на нем. Представления приложения не должны начинаться, пока проверки не будут завершены. Поскольку открытие UIMD является асинхронным, делегат приложения не выполняется, когда первый UIview пытается получить доступ к документу. Затем происходит сбой приложения из-за состояния гонки, поскольку делегат приложения и представление пытаются открыть документ одновременно, в то время как состояние документа еще не завершено.
Я использую раскадровку, поэтому сегы в значительной степени контролируют ОС... В следующий раз я все сделаю вручную...
Каковы будут ваши рекомендации? Примечание: 1) Я не могу выполнить задачу, когда приложение. переходит в фоновое состояние, потому что, если он снова будет восстановлен, избегать противоречивых состояний между базовой базой данных и тем, что отображается в представлении, будет очень утомительно. 2) По тем же причинам выполнение задачи обслуживания во время обычного выполнения не так просто сделать. 3) Все виды обращаются к UIMD через одиночный код в соответствии с предложенным здесь кодом.
Установка блокировки мьютекса в UIView не является моим предпочтительным маршрутом, потому что экран остается черным - нет данных - при отображении панелей вкладок, пока он не будет освобожден делегатом приложения.
Есть ли способ заставить делегата приложения ждать сигнала, прежде чем он передаст управление UIViews? В этом случае есть ли ошибки? Я подозреваю, что это, вероятно, не рекомендуемый способ, и iOS может убить приложение, если делегат слишком долго ожидает завершения задачи обслуживания. Что будет "слишком длинным" в этом случае?
1 ответ
Вы могли бы сделать это более элегантным способом. Первый вид, который увидит пользователь, должен быть чем-то вроде SplashView - просто изображение с индикатором прогресса. Он должен оставаться на вершине, пока ваша задача продолжается. Не очень важно, как вы показываете это представление. Вы можете установить его как первый в вашей раскадровке или просто создать его вручную в applicationDidFinishLaunching
сообщение. Затем в своей задаче отправьте NSNotification, когда он заканчивается, а в обозревателе в вашем AppDelegate просто спрячьте SplashView и представьте свое первое представление с ценным контентом. Вы даже можете добавить некоторые визуальные эффекты для перехода между этими представлениями, и ваше приложение будет выглядеть действительно великолепно!:)