12

次のコードを使用して、バックグラウンド アプリで NSNetService (「My_Mac」という名前) を IP に解決しようとしています。

NSNetService *service = [[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp" name:@"My_Mac"];
[service setDelegate:self];
[service resolveWithTimeout:5];

同じクラスで、次のデリゲート メソッドを定義しています。

- (void)netServiceDidResolveAddress:(NSNetService *)sender
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict

ここに奇妙な部分があります: "[service resolveWithTimeout:5];" の後に NSAlert を実行しない限り、どちらのデリゲート メソッドも呼び出されません。何か案は?

4

3 に答える 3

10

よくわかりませんが、何らかの理由でリクエストが実行ループで実際にスケジュールされていないようです。多分それをスケジュールするためにこのようなことを試してみませんか?

NSNetService *service = [[[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp." name:@"My_Mac"] autorelease];
[service setDelegate:self];
[service scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:@"PrivateMyMacServiceMode"];
[service resolveWithTimeout:8.0];

ばかげた質問ですが、明示的にNSServiceDelegateプロトコルを実装していますか、それとも単にメソッドを持っていますか?

編集:これはある種の競合状態である可能性があると別の考えがありました(より可能性の高いシナリオ)。デリゲートは通常、弱参照です。オブジェクトがスコープ外にドロップされ、自動解放されている場合、システムは nil ハンドルになり、メッセージを nil に送信します。NSAlert を表示する (または他の作業を行う) 場合、オブジェクトは、メッセージが返されるのに十分な時間ぶらぶらしている可能性があります。オブジェクトが 8 秒間くっついているのを確認できますか?

于 2009-12-25T05:21:41.910 に答える