2

从弹出框控制器中选择一个选项后,代理会被告知已做出选择。

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

不幸的是,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 的最佳方法是什么?

4

2 回答 2

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);
于 2012-08-27T14:59:00.987 回答
0

您可以使用UIPopOverController 的委托方法在弹出框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;
    }

}
于 2012-08-27T13:54:10.630 回答