サービス名の Bonjour 解決を同期的に実行しようとしているため、NSNetService の netServiceDidResolveAddress() 呼び出しを適切に待機する方法を見つけようとしています。
私のコードは次のようになります。
service = [[NSNetService alloc] initWithDomain:@"local." type:@"_myservice._tcp" name:[self name]];
[service retain];
[service setDelegate:self];
waitingOnResolution = true;
[service resolveWithTimeout:5.0];
for (int i=0;i<5;i++) {
DebugLog(@"resolve: resolve iteraton %u\n", i);
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; // run loop for one second
DebugLog(@"resolve: resolve iteraton %u (after run loop)\n", i);
if (!waitingOnResolution) break;
}
// continue processing...
そして、解決の成功を処理する私の関数は次のとおりです。
- (void)netServiceDidResolveAddress:(NSNetService *)sender
{
// do processing...
waitingOnResolution = false;
CFRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]); // has no effect
}
解決イベントが発生してから 1 秒ほどコードが実行され続ける限り、満足です。
実際に起こっていることは、解決が非常に迅速に行われ、netServiceDidResolveAddress() のコードが完了していることがわかりますが、runUntilDate から制御が戻るまで一貫して望ましくない 5 ~ 6 秒の待機があり、"...(実行後ループ) デバッグ ステートメント。
いくつかのメッセージ ボードを調べたところ、同様の質問がありましたが、それらの解決策 (CFRunLoopStop の使用など) は何の効果もないようです。
以下は、私が受け取るロギングの例です。
2011-07-11 09:38:07.267 MyProgram[1822:707] resolve: resolve iteraton 0
2011-07-11 09:38:07.299 MyProgram[1822:707] netService: netServiceDidResolveAddress function ended
[5+ second delay]
2011-07-11 09:38:12.907 MyProgram[1822:707] resolve: resolve iteraton 0 (after run loop)
誰かが NSNetService 解決を使用して同期結果を取得する別の方法を教えてくれたり、ランループ関連のコードをリファクタリングしてこの (OS によって作成されたように見える) 5 ~ 6 秒の遅延を回避したりできる場合は、感謝します。