0

これは、WWDC 2010 セッション 208 のスライドです。

conn = [[NSURLConnection alloc] initWithRequest:req
  delegate:self startImmediately:NO];
[conn scheduleInRunLoop: [NSRunLoop currentRunLoop]
  forMode: NSDefaultRunLoopMode];
[conn start];

複数の conn を currentRunLoop に入れることに関連する問題はありますか?

バックグラウンド スレッドの実行ループで NSURLConnection をスケジュールすると、どのような利点がありますか?

ありがとうございました!

4

1 に答える 1

2

「二次実行ループ」というフレーズの使用は、実行ループが何であるかを知らないことを示唆しています。

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% でデュアルコアが必要になることはほぼ確実です。)

于 2010-08-17T03:36:16.343 に答える