Почему происходит задержка при представлении этого модального представления? - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть приложение, которое начинается с табличного представления (из xib), которое загружает несколько контроллеров навигации. Я хочу представить модальное представление при запуске, если выполняется длинная последовательность инициализации. Я попытался представить модальное представление в App Delegate, но представление не появляется до тех пор, пока основной код уже завершен.

MainWindow.xib загружает TableViewController, поэтому я отправил вызов presentmodalview в этом представлении. Появится с тем же результатом. У меня есть многочисленные вызовы NSLOG, поэтому я могу наблюдать за происходящим, но я не могу понять, почему представление не появляется до тех пор, пока не завершится как делегат приложения, так и viewWillAppear контроллера таблицы. Я переместил вызов viewDidAppear с тем же результатом. Вот фрагмент кода:

Делегат приложения:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    // Add the tab bar controller's current view as a subview of the window
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];

    // if new version being installed do init stuff
    if ( <needs update code here>) {
        Uncompress *uncompressView = [[Uncompress alloc] initWithNibName:@"Uncompress" bundle:nil];
        [self.tabBarController presentModalViewController:uncompressView animated:NO];
        [uncompressView release];
    }
}

Я также безуспешно пытался изменить presentmodalviewcontroller на [window addSubview:uncompressView.view].

Код обновления работает очень хорошо, проблема в том, что представление не появляется, пока не завершены и AppDelegate, и TableView. Я не создаю какие-либо взгляды программно - все из Xib's. Я не могу понять, где вызвать функцию обновления, чтобы сразу же появилось представление. Любая помощь приветствуется. Спасибо!

1 Ответ

2 голосов
/ 10 февраля 2011

В iOS пользовательский интерфейс обновляется только тогда, когда ваш код возвращает управление в цикл выполнения.Поэтому, если ваша распакованная задача занимает много времени, пользовательский интерфейс будет обновляться только после ее завершения.

Вы можете обойти эту проблему, поместив трудоемкую задачу в отдельный метод и вызвавметод с [self performSelector:... afterDelay:0.0 ...];, но это не очень хорошее решение, потому что даже если пользовательский интерфейс будет обновляться, взаимодействие пользователя с вашим приложением будет по-прежнему заблокировано, пока ваш код блокирует основной поток.И если запуск вашего кода занимает более нескольких секунд (например, потому что он работает на более старом, более медленном устройстве), сторожевой таймер ОС убьет ваше приложение.

Лучшее решение - установитьинтенсивная задача в фоновом потоке, например, с NSOperation или dispatch_async().

...