关闭 UIPopoverController 的最快方法是啥?
Posted
技术标签:
【中文标题】关闭 UIPopoverController 的最快方法是啥?【英文标题】:Fastest way to dismiss a UIPopoverController?关闭 UIPopoverController 的最快方法是什么? 【发布时间】:2012-09-12 16:57:56 【问题描述】:我将来自 UIPopoverController 的通知发布回我的主视图,然后立即调用dismissPopoverAnimated,然后开始执行一些相当繁重的工作来加载 Web 视图。所有这些代码都有效;问题在于,在一些较旧的 ipad 上,直到 CPU 密集型工作完成(在调试器中验证)之后,popover 才会真正解除。这会导致弹出框在被解雇后似乎挂起一秒钟。如何确保立即关闭弹出框而不是先执行密集代码?
响应通知的方法如下:
- (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;
【问题讨论】:
【参考方案1】:popover 消失的动画发生在主运行循环上;如果你在主线程上做繁重的 CPU 工作,那么循环将没有机会运行。所以你需要做的是在后台线程上执行你的工作。
目前首选的方法是使用 Grand Central Dispatch,如下所示:(我假设 loadCategory:
是 CPU 密集型操作)
- (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];
);
);
【讨论】:
谢谢,这应该会有很大帮助 - 我也可以将 addWidgets 放在块中,我会尽快使用它。 假设 addWidgetsToView 将任何内容添加到您的视图中,您需要将其放在主队列中。 是的 - 我试过了,但它崩溃了,但亲眼目睹这仍然是一个很好的教训。您的代码的唯一变化是我还将 for 循环/删除对象放入后台线程,现在它工作得很好。再次感谢!以上是关于关闭 UIPopoverController 的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
关闭 UIPopoverController 的最快方法是啥?
如何在 UIPopoverController 上创建按钮 [关闭]
关闭 UIPopoverController 不会卸载 contentController