「二次実行ループ」というフレーズの使用は、実行ループが何であるかを知らないことを示唆しています。
NSRunLoop は、スレッドの「メイン ループ」の実装です。多かれ少なかれ、
while ([runLoop waitNextEvent]) {
NSAutoreleasePool * pool = [NSAutoreleasePool new];
[runLoop handleEvent];
[pool release]; pool = nil;
}
実行ループにはスレッドがあります。各スレッドには、最大で 1 つの実行ループがあります。「performSelectorOnMainThread」は実行ループでそれをスケジュールしますが、プログラマーは通常、スレッドが使用している実行ループの抽象化ではなく、スレッドについて話します。それらはすべて同じであるためです。すべてのスレッドに実行ループがあるわけではありません (NSThread の関数は通常、実行ループのないスレッドを提供します。実行ループが必要な場合は、自分で実行ループを作成する必要があると思います)。
「currentRunLoop」は、現在実行中のスレッドの実行ループです。NSOperation/dispatch_*/etc を使用していない限り、これはおそらくメイン スレッドです。別のスレッドでスケジュールすると、(私が思うに) デリゲート コールバックは別のスレッドから実行されます。あなたはおそらくそれが起こることを望んでいません。
さて、スレッド。
ほとんどの時間アイドル状態のバックグラウンド スレッドを生成しても意味がありません。NSURLConnection は、ほとんど処理する必要がありません (そもそも、それほど多くの帯域幅を電話に入れることはできません)。メインの実行ループでの実行に関連するオーバーヘッドは実質的にありません。スレッドのオーバーヘッドははるかに大きくなる傾向があります。
データを処理していて、その処理が CPU を集中的に使用する場合は、バックグラウンド スレッドで実行することをお勧めします。接続をバックグラウンド スレッドに配置することもできますが、一般に、メイン スレッドでできるだけ多くのことを行う方が簡単です。
また、スレッド間通信の問題については触れません。これは大きな問題だからです。必要であることがわかっている場合にのみ、並行性を使用してください。
(そして、iPhone がデュアルコアになるまでは、作成するコードの 99% でデュアルコアが必要になることはほぼ確実です。)