すべてのUIKit操作をメインスレッドで実行する必要があるのは間違いです。メインスレッドでは、描画を行う操作のみを実行する必要があります。UIImageを別のスレッドにロードし、その後メインスレッドに渡すことは完全に節約されます。ただし、読み込みにそれほど時間はかからないと思います。時間がかかる絵かもしれないと思います。
ただし、aUIActivityIndicatorView
は(すべてのCoreAnimationアニメーションと同様に)独自のスレッドで実行されているため、インジケーターが追加された後にメインスレッドをブロックしても、アニメーションを継続します。これを試して:
UIActivityIndicatorView* activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityIndicator startAnimating];
[self addSubview:activityIndicator];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage* image = [UIImage imageNamed:@"MyImage"];
UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
[self addSubview:imageView];
[activityIndicator removeFromSuperview];
});
これにより、が開始UIActivityIndicator
され、次の実行ループサイクルでイメージのロードが開始されます。画像が追加されると、スーパービューが削除されます。UIKitが画像を描画する時間を確保できるように、アクティビティインジケーターの削除を再度ディスパッチする必要があるかもしれません。この場合、ただし、最初のブロック内のメインキューの[activityIndicator removeFromSuperview]
別の場所にあります。dispatch_async