1

Runloopsについての私の理解は基本的なものなので、これは非常に些細な質問のように思えるかもしれません。

私のapplication:didFinishLaunchingWithOptions(またはapplicationDidFinishLaunching)には次のものがあります:

{
// 1. typical app setup work: create various views, create a tab bar, add 
// navigation controller and views to the tab bar 

// 2. perform some other app initialization tasks

// 3. Add main view to the window
[window addSubview:tabbarController.view];

// 4. Make window visible
[window makeKeyAndVisible];

// 5. Perform one final behind the scene task
[myTaskObject doSomeTaskHere];
}

これらの各メソッドは、リストされている順序で実行されますか、またはアプリのメイン実行ループがメインウィンドウを表示する作業を完了する前にステップ5が発生する可能性がありますか?'[window makeKeyAndVisible]'

runloopがウィンドウの表示を完了し、' 'が呼び出される前に最上位のビューであるビューをロードすることを保証するために、にラップするdoSomeTaskHere必要がありますか?performSelectorOnMainThread:withObject:waitUntilDone:YESdoSomeTaskHere

4

1 に答える 1

0

これらのタスクは、メインスレッドの実行ループで順番に実行されます。UIの更新はメインスレッドでも行われるため、アプリが画面を再描画することは、そこから戻るまで許可されません。-application:didFinishLaunchingWithOptions:その間、UIの更新が[window makeKeyAndVisible];完了[myTaskObject doSomeTaskHere];するまで、UIの更新をブロックdoSomeTaskHereします。

コストのかかる操作の場合doSomeTaskHereは、実行ループの将来の反復のためにスケジュールする必要がありますが、UIが更新されてタッチに応答できるように、別のスレッドでその作業を行うことをお勧めします。

performSelectorOnMainThread:withObject:waitUntilDone:YESNO最後のパラメータとして渡さない限り、メインスレッドがUIを更新することを許可しません。メインスレッドが他の作業を終了するまで待機するようにメインスレッドに指示することは、あまり役に立たないか、そのセレクターを直接呼び出すことと何ら変わりはありません。

于 2011-01-17T21:19:37.393 に答える