Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Самый быстрый способ закрыть UIPopoverController?

Автор вопроса: Shteven WОтветов: 1

Я отправляю уведомление из UIPopoverController обратно в свое основное представление, которое затем немедленно вызывает уволитьPopoverAnimated, а затем выполняет довольно тяжелую работу по загрузке веб-представлений. Весь этот код работает; проблема в том, что на некоторых старых iPad всплывающее окно фактически не закрывается до тех пор, пока не будет завершена интенсивная работа процессора (проверено в отладчике). Это приводит к тому, что всплывающее окно зависает на секунду после закрытия. Как я могу обеспечить немедленное отклонение всплывающего окна вместо того, чтобы сначала выполнять интенсивный код?

Метод, который отвечает на уведомление, выглядит следующим образом:

- (void)changeDefaultView:(NSNotification *)note
{
    [self closePopover];

    int i;
    for(i = 0; i < [arrWebViewControllers count]; i++)
    {
        WebViewController *wvc = [arrWebViewControllers objectAtIndex:i];
        [[wvc webview] stopLoading];
        [[wvc webview] removeFromSuperview];
        [[wvc imageview] removeFromSuperview];
        wvc = nil;
    }

    [arrWebViewControllers removeAllObjects];
    [arrLinks removeAllObjects];
    [arrImageViews removeAllObjects];

    [self loadCategory:[note object]];

    [self addWidgetsToView];
}

и closePopover:

- (void)closePopover
{
    if(popover != nil)
    {
        [popover dismissPopoverAnimated:YES];
        popover = nil;
    }
}

iosipaduipopovercontroller

Ответы

Ответ 1 · Simon

Анимация исчезающего всплывающего окна происходит в основном цикле выполнения; если вы выполняете тяжелую работу ЦП в основном потоке, цикл не сможет запуститься. Итак, что вам нужно сделать, это выполнить свою работу в фоновом потоке.

В настоящее время предпочтительным способом сделать это является использование Grand Central Dispatch, например: (я предполагаю, что loadCategory: является операцией с интенсивным использованием ЦП)

- (void)changeDefaultView:(NSNotification *)note
{
    [self closePopover];

    int i;
    for(i = 0; i < [arrWebViewControllers count]; i++)
    {
        WebViewController *wvc = [arrWebViewControllers objectAtIndex:i];
        [[wvc webview] stopLoading];
        [[wvc webview] removeFromSuperview];
        [[wvc imageview] removeFromSuperview];
        wvc = nil;
    }

    [arrWebViewControllers removeAllObjects];
    [arrLinks removeAllObjects];
    [arrImageViews removeAllObjects];

    // perform the expensive operation on a background thread
    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        [self loadCategory:[note object]];

        // now get back onto the main thread to perform our UI update
        dispatch_async(dispatch_get_main_queue(), ^{

            [self addWidgetsToView];

        });

    });
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы