UIKit のシングルスレッドの性質は、ホスト イメージをメイン スレッドで更新する必要があることを意味します。これは、描画によってユーザーの操作が中断され、アプリ全体が応答しなくなったように見える可能性があることを意味します。これについてできることはあまりありませんが、ユーザーが描画が完了するまで待たされることは避けたいと思います。
この問題に対処するために、使用できる方法がいくつかあります。場合によっては、事前に別のスレッドで投機的にコンテンツを描画し、そのようにして描画された画像をレイヤーのコンテンツとして直接設定できます。これは実装があまり便利ではないかもしれませんが、特定の状況では実現可能です。 Core Animation には、CATiledLayer とdrawsAsynchronously プロパティといういくつかのオプションが用意されています。
CATiledLayer については第 6 章で簡単に説明しました。レイヤーを独立して更新する小さな部分に再度分割することに加えて (汚れた四角形の自動更新の概念と同様)、CATiledLayer には興味深い機能があります。それは、複数のスレッドで小さな部分ごとに -drawLayer:inContext: メソッドを同時に呼び出すことです。これにより、ユーザーの操作のブロックが回避され、マルチコアの新しいスライスを利用してより高速な描画が可能になります。 CATiledLayer の小さな部分は、ピクチャ ビューを非同期的に更新する簡単な方法です。
drawsAsynchronouslyCATiledLayer で使用される非同期描画とは異なります。独自の -drawLayer:inContext: メソッドはメイン スレッドでのみ呼び出されますが、CGContext は各描画コマンドの終了を待ちません。代わりに、コマンドをキューに入れ、メソッドが戻ったときにバックグラウンド スレッドで実際の描画を 1 つずつ実行します。
Appleによると。この機能は、頻繁に再描画する必要があるビュー (描画アプリケーションや UITableViewCell など) で最もよく機能しますが、一度しか描画されない、またはめったに再描画されないレイヤー コンテンツにはあまり役に立ちません。
まとめ