Я обновляю довольно простое приложение для iPhone, которое требует начальной загрузки данных в базу данных SQLite при начальной настройке. Я использую класс DSActivityView для предоставления приятного сообщения «Пожалуйста, подождите». Полная загрузка данных занимает около 15 секунд в Wi-Fi и около 30-45 секунд в 3G.
Весь этот процесс происходит в приложении: метод didFinishLaunchingWithOptions моего делегата приложения.
Процедуры загрузки данных запускаются в отдельном потоке путем создания экземпляра объекта NSOperation с именем UpdateTable для каждой из 8 таблиц. Каждая операция помещается в NSOperationQueue, а затем освобождается. Загрузка данных работает как чемпион.
Что НЕ работает как чемпион; однако это замена представления «Пожалуйста, подождите ..» на представление основного контроллера навигации.
Первый подход состоял в том, чтобы создать экземпляр NSInvocationOperation, который вызвал метод в моем делегате приложения для выполнения следующего:
- (void) loadNavController;
{
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
[defaultImageView removeFromSuperview];
[DSBezelActivityView removeViewAnimated:YES];
}
Эта операция была добавлена в очередь после добавления последней операции UpdateTable.
Причина, по которой этот подход ошибочен, заключается в том, что NSInvocationOperation выполняется одновременно с другими процессами в потоке; поэтому вышеописанный метод срабатывает до того, как может быть выполнено последнее обновление таблицы.
Итак, я попробовал следующий подход:
В моем UpdateTable.m (где происходят все JSON и SQLite) я ввел следующую строку для выполнения сразу после последнего обновления таблицы:
[appDelegate performSelectorOnMainThread:@selector(loadNavController) withObject:nil waitUntilDone:NO];
Этот подход правильно выбрал время, однако основные объекты UNavigationController и UIWindow были равны нулю при выполнении loadNavController. Устанавливая некоторые разрывы отладки, я заметил, что метод delloc моего делегата приложения запускался до того, как был выполнен метод loadNavController. Оба объекта назначаются главному окну через IBOutlets, которые настроены как IBOutlets (nonatomic, retain) в делегате приложения. Я не имею ни малейшего представления о том, почему Deloloc стреляет, так как этот процесс занимает менее 10 секунд.
Буду очень признателен за любую помощь, которую вы можете оказать. Спасибо заранее.
VB