Начальная загрузка данных с iPhone и экран «Пожалуйста, подождите» - PullRequest
0 голосов
/ 20 октября 2011

Я обновляю довольно простое приложение для 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

1 Ответ

1 голос
/ 21 октября 2011

Быстрое примечание, чтобы обновить эту тему с решением.

Подход executeSelectorOnMainThread оказался верным. Причина, по которой объект navController был нулевым при вызове селектора, была вызвана тем, что я создал новый экземпляр делегата приложения:

AppDelegate *appDelegate = [AppDelegate alloc] init];

вместо ссылки на существующий объект:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

Работает как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...