0

iPadアプリのほとんどのViewControllerの背景画像として、大きな画像(2000x2000、500kb)を使用しています。

問題は、子ViewControllerにそのような画像を初めてロードするときに、アプリが親ViewControllerでフリーズするように見えることです(後で、キャッシュがあるため、より高速になります)。

別のスレッドにロードし、ロード中にインジケーターを表示しますが、UI関連のすべての操作はメインスレッドで実行する必要があることを知っています。

ユーザーエクスペリエンスを向上させる方法はありますか?アプリが約1秒間フリーズしないようです。2秒?(私の場合、画像をタイリングすることはできません)

4

1 に答える 1

5

すべての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

于 2012-10-18T10:06:32.997 に答える