がコンテンツをロードして画面に表示されるUIViewController
までに約 0.5 秒かかります。それらをすべてバックグラウンドでロードし、準備ができたときに表示するにはどうすればよいですか?
4 に答える
AppleデベロッパサイトにLazyTableImagesサンプルがあります。
バックグラウンドスレッドでヘビーリフティングを実行し、メインスレッドのUIを更新する方法を示します。
PerformSelectorInBackground:withObject:
より現代的な方法は非同期ブロックを使用することですが、は可能な解決策です。これらのブロック内からメインスレッドでコードを実行して、UIを安全に更新できます。
並行性プログラミングガイドは、この詳細と例を見つけるのに適した場所です。
バックグラウンド スレッドは UI を更新できません。バックグラウンド スレッドですべての処理ロジックを実行し、UI 更新のためにメイン スレッドを呼び出すことができます。
データを含む tableView をロードする例、バックグラウンド スレッドを使用してすべてを処理し、データをロードする[tableView reloadData]
、メイン スレッドを使用して呼び出す、IOS でスレッドを操作する方法については、グランド セントラル ディスパッチを参照してください。
それが役に立てば幸い
バックグラウンド スレッドで作業を処理するための GCD キューを作成します (「作成」ラベルとオプションが必要なものではない可能性があるため、ドキュメントを参照してください)。
それを非同期的にキューに送信します。つまり、dispatch_async の呼び出しにより、指定したコード ブロックが別のスレッドで実行されるように適切な調整が行われ、「すぐに」返されます。
指定したブロック内のすべての作業は、別のスレッドで実行されます。最後に、別の呼び出しを行うことに注意してください。今回はよく知られているメイン キューを使用します。これにより、そのコードがメイン スレッドで実行されるように調整されます。これは、UI 作業に必須です。
また、メモリとサイクルに関する考慮事項があるため、GCD、特にブロックに関するドキュメントを読む必要があります。幸運を。
dispatch_queue_t workQ = dispatch_queue_create("bgWorkQ", 0);
dispatch_async(workQ, ^{
// This code is now running in a background thread.
// Do all your loading here...
// When ready to touch the UI, you must do that in the main thread...
disptach_async(dispatch_get_main_queue(), ^{
// Now, this code is running in the main thread.
// Update your UI...
});
});
dispatch_release(workQ);
最も簡単な方法は、NSObjectを使用する- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
ことです。セレクターを渡すだけで、バックグラウンドで満足し、UIをブロックしません。ただし、バックグラウンドスレッドにはルールがあることに注意してください。
バックグラウンドスレッドからUIを更新しないでください。また、呼び出しているメソッドがスレッドセーフであることを確認する必要があります。