1

UIPopoverController からの通知をメイン ビューに投稿しています。メイン ビューはすぐに、dismissPopoverAnimated を呼び出し、Web ビューをロードするかなり重い作業を実行します。このコードはすべて機能します。問題は、一部の古い iPad では、CPU を集中的に使用する作業が完了するまで (デバッガーで確認)、ポップオーバーが実際に閉じられないことです。これにより、ポップオーバーが閉じられた後、2 秒間ハングしているように見えます。最初に集中的なコードを実行する代わりに、ポップオーバーがすぐに閉じられるようにするにはどうすればよいですか?

通知に応答するメソッドは次のとおりです。

- (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;
    }
}
4

1 に答える 1

0

消えるポップオーバーのアニメーションは、メインの実行ループで発生します。メイン スレッドで CPU を大量に使用している場合、ループを実行する機会がありません。したがって、バックグラウンド スレッドで作業を実行する必要があります。

これを行うために現在推奨されている方法は、Grand Central Dispatch を使用することですloadCategory:

- (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];

        });

    });
}
于 2012-09-12T17:18:00.523 に答える