如何在执行冗长操作时隐藏UIPopoverController?

时间:2012-08-27 13:48:40

标签: ios ipad uipopovercontroller

从弹出控制器中选择一个选项后,会通知代表已做出选择。

我想解除弹出窗口,将其从屏幕上移除,并向用户显示活动指示器。

不幸的是,dismissPopover下面的代码在popover实际消失之前运行,导致漫长的等待而没有出现任何事情。

- (void)itemSelected:(int)option {

    [popController dismissPopoverAnimated:YES];

    activityIndicator.hidden = NO;
    [activityIndicator startAnimating];

    switch (option) {
        case 0:
            // Do something that takes some time
            break;

        case 1:
            // Do something that takes even longer
            break;
    }

}

解除弹出窗口后,将控制权返回给调用ViewController的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

问题在于,当您更改UI时,它不会立即发生。实际上,这些更改将在下次主事件循环结束时排队。由于这通常会马上发生,我们通常不必担心差异。所有UI更新都发生在主线程上,并且由于您的长操作也在主线程上,因此应用程序永远不会更新UI直到长操作完成。

一种解决方案是使用Grand Central Dispatch将这些操作卸载到另一个线程,这将允许主线程继续执行(以及UI继续更新),直到操作完成。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{
    [self performReallyLongOperation];
});

dispatch_release(queue);

答案 1 :(得分:0)

您可以使用UIPopOverController's delegate方法popoverControllerDidDismissPopover在弹出窗口解除后执行您的代码:

标题

<UIPopoverControllerDelegate>

实施

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    activityIndicator.hidden = NO;
    [activityIndicator startAnimating];

    switch (option) {
        case 0:
            // Do something that takes some time
            break;

        case 1:
            // Do something that takes even longer
            break;
    }

}