Apple のMVCNetworkingサンプル コードでは、 (非同期NetworkManager
で実行するために) ネットワーク アクティビティ専用のセカンダリ スレッドで実行ループを維持するために、クラスにこのメソッドが含まれています。NSURLConnection
- (void)networkRunLoopThreadEntry
{
while(YES) {
NSAutoreleasePool *pool;
pool = [[NSAutorelease alloc] init];
[[NSRunLoop currentRunLoop] run];
[pool drain];
}
}
run
実行ループに接続されたソースがない場合、メソッドはすぐに終了するため、while
現在実行ループに接続されている NSURLConnection がない場合、CPU リソースを無用に消費する無限ループのように見えます。
一方、実行ループをアクティブに保つために、実行ループで空のポートをスケジュールすることを 提案する人もいます。
- (void)networkRunLoopThreadEntry
{
NSAutoreleasePool *pool = [[NSAutorelease alloc] init];
NSPort *port = [NSPort port];
[[NSRunLoop currentRunLoop] addPort:port forMode:NSRunLoopCommonModes];
[NSRunLoop run];
[pool drain];
}
ただし、この場合、私の懸念は、run
メソッドが終了しないことです。つまり、プールが空になることはありません。つまり、セカンダリ スレッドで割り当てられて自動解放されたすべてのオブジェクトがリークすることになります。
その場合、どのような方法がありますか?
NSURLConnection
(コンテキストについては、他の多くの場合と同様に、非同期を 内にカプセル化しようとしてNSOperation
います。これは、メイン スレッドの外部でトリガーできることを意味します。また、MVCNetworking サンプル コードと、WWDC 2010 セッションの iPhone 用ネットワーク アプリOSは、メイン スレッドでの遅延を防ぐために、ネットワーク転送専用の独自のセカンダリ スレッドを用意することをお勧めしているようです。)