5

Nカスタムビューを描画するために、次のNSOperationを実装しました

- (void)main {

    for (int i=0; i<N; i++) {

       << Alloc and configure customView #i >>
       //(customView is a UIView with some drawing code in drawrect)

       [delegate.view addSubview:customView];

    }

    NSLog(@"Operation completed");
}

私が持っているcustomViewのdrawRectメソッドで

- (void)drawRect {

    <<Drawing code>>

    NSLog(@"Drawed");
    delegate.drawedViews++;

    if (delegate.drawedViews==VIEWS_NUMBER) {
        [delegate allViewsDrawn];
    }
}

したがって、すべてのビューが描画されると、デリゲートは通知を受け取ります。

問題は、「操作が完了した」ログの後、最初の「描画された」ログが表示されるまでに約5秒かかることです。

なぜこうなった?そして、一般的に言って、実行に非常に時間がかかっているコード行を見つけるために、どのように振る舞うべきですか?

- - - 編集 - - -

addsubviewスレッドセーフではないため、NSOperationから呼び出すべきではないため、これを実行するとクラッシュすることがありました(10回に1回など) 。だから私はそれを次のように変更しました:

[delegate.view  performSelectorOnMainThread:@selector(addSubview:) withObject:customView waitUntilDone:NO];

これでクラッシュは発生しなくなりましたが、プロセスの実行には非常に長い時間がかかります。以前の5倍のように。

なんでこんなに遅いの?

4

1 に答える 1

5

物事を適切に機能させるには、NSOperation を忘れて、この「トリック」を使用する必要があります

dispatch_queue_t main_queue = dispatch_get_main_queue();
dispatch_async(main_queue, ^{

    [self createCustomViews];

    dispatch_async(main_queue, ^{

        [self addAnotherCustomViewToView];

    });
});
于 2012-05-24T12:30:40.060 に答える