Ios 解除超控器的最快方法?
我将UIPopoverController的通知发回我的主视图,然后它立即调用dismissPopoverAnimated,然后开始执行一些相当繁重的工作来加载web视图。所有这些代码都有效;问题是,在一些较旧的iPad上,直到cpu密集型工作完成(在调试器中验证)之后,popover才真正被解除。这会导致popover在被解除后挂起第二秒钟。我怎样才能确保popover立即被取消,而不是先执行密集型代码 响应通知的方法如下所示:Ios 解除超控器的最快方法?,ios,ipad,uipopovercontroller,Ios,Ipad,Uipopovercontroller,我将UIPopoverController的通知发回我的主视图,然后它立即调用dismissPopoverAnimated,然后开始执行一些相当繁重的工作来加载web视图。所有这些代码都有效;问题是,在一些较旧的iPad上,直到cpu密集型工作完成(在调试器中验证)之后,popover才真正被解除。这会导致popover在被解除后挂起第二秒钟。我怎样才能确保popover立即被取消,而不是先执行密集型代码 响应通知的方法如下所示: - (void)changeDefaultView:(NSNot
- (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];
}
消失的popover动画发生在主运行循环上;如果在主线程上执行繁重的CPU工作,那么循环将没有机会运行。因此,您需要做的是在后台线程上执行工作 当前首选的方法是使用Grand Central Dispatch,如下所示:(我假设
loadCategory:
是CPU密集型操作)
-(无效)changeDefaultView:(NSNotification*)注释
{
[自动关闭Popover];
int i;
对于(i=0;i<[ArrWebViewController计数];i++)
{
WebViewController*wvc=[arrWebViewController对象索引:i];
[[wvc webview]停止加载];
[[wvc webview]从超级视图中移除];
[[wvc imageview]从SuperView中移除];
wvc=零;
}
[ArrWebViewController删除所有对象];
[arrLinks removeAllObjects];
[arrImageViews removeAllObjects];
//在后台线程上执行昂贵的操作
调度异步(调度获取全局队列(0,0)^{
[自加载类别:[注释对象]];
//现在回到主线程来执行UI更新
dispatch\u async(dispatch\u get\u main\u queue()^{
[自添加WidgetStoView];
});
});
}
谢谢,这应该会有很大帮助-我可能也会将addWidgets放在块中,我很快就会使用它。假设addWidgetsToView为您的视图添加了任何内容,您需要将其放在主队列中。是的-我尝试过,但它崩溃了,但这仍然是一个很好的教训,可以直接看到。代码中唯一的变化是我还将for循环/remove对象放到了后台线程中,现在它工作得很好。再次感谢!
- (void)closePopover
{
if(popover != nil)
{
[popover dismissPopoverAnimated:YES];
popover = nil;
}
}
- (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];
});
});
}