1

がコンテンツをロードして画面に表示されるUIViewControllerまでに約 0.5 秒かかります。それらをすべてバックグラウンドでロードし、準備ができたときに表示するにはどうすればよいですか?

4

4 に答える 4

2

AppleデベロッパサイトにLazyTableImagesサンプルがあります。

バックグラウンドスレッドでヘビーリフティングを実行し、メインスレッドのUIを更新する方法を示します。

PerformSelectorInBackground:withObject:より現代的な方法は非同期ブロックを使用することですが、は可能な解決策です。これらのブロック内からメインスレッドでコードを実行して、UIを安全に更新できます。

並行性プログラミングガイドは、この詳細と例を見つけるのに適した場所です。

于 2012-05-23T12:06:55.630 に答える
1

バックグラウンド スレッドは UI を更新できません。バックグラウンド スレッドですべての処理ロジックを実行し、UI 更新のためにメイン スレッドを呼び出すことができます。

データを含む tableView をロードする例、バックグラウンド スレッドを使用してすべてを処理し、データをロードする[tableView reloadData]、メイン スレッドを使用して呼び出す、IOS でスレッドを操作する方法については、グランド セントラル ディスパッチを参照してください。

それが役に立てば幸い

于 2012-05-23T13:28:34.660 に答える
1

バックグラウンド スレッドで作業を処理するための 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);
于 2012-05-23T14:24:27.270 に答える
0

最も簡単な方法は、NSObjectを使用する- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)argことです。セレクターを渡すだけで、バックグラウンドで満足し、UIをブロックしません。ただし、バックグラウンドスレッドにはルールがあることに注意してください。

バックグラウンドスレッドからUIを更新しないでください。また、呼び出しているメソッドがスレッドセーフであることを確認する必要があります。

于 2012-05-23T12:00:55.117 に答える