Ios 解除超控器的最快方法?

Ios 解除超控器的最快方法?,ios,ipad,uipopovercontroller,Ios,Ipad,Uipopovercontroller,我将UIPopoverController的通知发回我的主视图,然后它立即调用dismissPopoverAnimated,然后开始执行一些相当繁重的工作来加载web视图。所有这些代码都有效;问题是,在一些较旧的iPad上,直到cpu密集型工作完成(在调试器中验证)之后,popover才真正被解除。这会导致popover在被解除后挂起第二秒钟。我怎样才能确保popover立即被取消,而不是先执行密集型代码 响应通知的方法如下所示: - (void)changeDefaultView:(NSNot

我将UIPopoverController的通知发回我的主视图,然后它立即调用dismissPopoverAnimated,然后开始执行一些相当繁重的工作来加载web视图。所有这些代码都有效;问题是,在一些较旧的iPad上,直到cpu密集型工作完成(在调试器中验证)之后,popover才真正被解除。这会导致popover在被解除后挂起第二秒钟。我怎样才能确保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];
}

消失的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];

        });

    });
}