1

サービス名の 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 秒の遅延を回避したりできる場合は、感謝します。

4

2 に答える 2

1

あなたは本当にこれをすべきではありません。ネットワーク解決は正当な理由で非同期です。解決の実行には長い時間がかかる可能性があり、ほとんどの場合、その間スレッドをブロックしたくありません。メイン スレッドで解決を行っている場合は、同期的に実行したくありません。Mac OS X では、メイン スレッドをブロックする長時間の操作により、ビーチボールが回転します。iOS では、ウォッチドッグがアプリを完全に強制終了する可能性があります。

API は、適切に使用できるように非同期になっています。それと戦おうとしないでください。

これを同期的に実行しようとしている理由を説明していないため、これ以上のことはできませんが、Cocoa はイベント駆動型であることを覚えておいてください。同期ステップを状態に分割し、各段階で Cocoa からのコールバックが状態マシンを前進させます。行ごとの手続き型関数ほど見栄えはよくありませんが、UI の応答性を維持し、見苦しい回避策を回避できます。

于 2011-07-11T20:20:41.150 に答える