5

非同期UITableViewでロードされるコンテンツがいくつかあります。ユーザーがデバイスを回転させると、メソッドで作成する必要があります。私の場合、 ReloadData は非同期で動作します。[tableView reloadData]-willRotateToInterfaceOrientation

reloadData がメイン スレッドで動作することは理解していますが、私の場合は非同期で動作する cellForRowAtIndexPath を起動します。

問題は、メインスレッドUITableView's reloadDataが終了するまで待機させる方法です。

4

3 に答える 3

3

CFRunLoopRunを使用 して、UITableView データがリロードされるまでメイン スレッドを待機させることができます。データがリロードされたら、 CFRunLoopGetMainの結果をパラメーターとして渡してCFRunLoopStopを呼び出します。

于 2012-05-10T13:57:59.233 に答える
2

willRotateToInterfaceOrientation から reloadData を呼び出すと、メイン スレッドで呼び出されます。実際、UIView はスレッド セーフではなく、メイン スレッドからのみ処理する必要があります (何らかの理由で誰かが別のスレッドから reloadData を呼び出すことを思いついた場合)。

「非同期」という用語に関連して混乱があると思います。willRotateToInterfaceOrientation などの UI デリゲートの非同期コールバックは、メイン スレッドで呼び出されます。非同期であるということは、必ずしも別のスレッドを意味するわけではありません (ただし、非同期で実行すると「並列」になります)。

NSRunLoop に関する Apple のドキュメントを読むことをお勧めします。これは、iOS アプリの実行方法の不可欠な部分であり、アプリ プログラマーが理解する必要があります。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

于 2012-05-10T13:53:40.377 に答える