从弹出控制器中选择一个选项后,会通知代表已做出选择。
我想解除弹出窗口,将其从屏幕上移除,并向用户显示活动指示器。
不幸的是,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的最佳方法是什么?
答案 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;
}
}