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倍のように。
なんでこんなに遅いの?