6

didFindService関数でTXTrecordsを取得しようとしましたが、値がnullであることがわかりました。

私の問題を解決するためのアイデアはありますか?

- (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser didFindService:(NSNetService*)service moreComing:(BOOL)moreComing {
    [self.services addObject:service];

    NSDictionary* dict = [[NSNetService dictionaryFromTXTRecordData:[service TXTRecordData]] retain];
    MyTreeNode *node = [[MyTreeNode alloc] initWithValue:[service name]];
    NSString* info = [self copyStringFromTXTDict:dict which:@"info"];
    if([info isEqualToString:@"child"]) { // info == null and dict == null??
        [treeNode addChild:node];
    }
    [info release];
    if (!moreComing) {
        [self sortAndUpdateUI];
    }
}
4

3 に答える 3

7

最初にサービスを解決する必要があります。コールバックには、サービスが存在することだけがわかっていますが、そのレコード(AもTXTも)がありません。

あなたは-resolveWithTimeout:それを解決するために使用することができます。-startMonitoringTXTレコードが変更されたときに通知を受け取る必要がある場合にも使用できます。

于 2012-09-06T19:48:38.820 に答える
1

私はdidFindService関数を次のように変更しました(私のアプリケーションはApple "BonjourWeb"の例に基づいています):

- (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser didFindService:(NSNetService*)service moreComing:(BOOL)moreComing {
    [self.services addObject:service];
    NSInteger i,n = [self.services count];
    for(i=0;i<n;i++)
    {
        NSLog(@"%d %@",i,[[self.services objectAtIndex:i]name]);
        if (self.currentResolve) {
            [self stopCurrentResolve];
        }
        self.currentResolve = [self.services objectAtIndex:i];
        [self.currentResolve setDelegate:self];
        [self.currentResolve resolveWithTimeout:0.0];
        self.timer = [NSTimer scheduledTimerWithTimeInterval:20.0 target:self selector:@selector(showWaiting:) userInfo:self.currentResolve repeats:NO];
    }

    if (!moreComing) {
        [self sortAndUpdateUI];
    }
}

アプリケーションの実行中に、関数netServiceDidResolveAddressが1回呼び出され、配列self.servicesの最後の要素のみを解決することに気付きました(11のサービスがあり、インデックスが10のオブジェクトのみを解決します)。私の問題は、すべてのサービスを解決することです。

于 2012-09-10T21:39:51.747 に答える
1

私の問題はここで解決されました:最終的なコードです:

- (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser didFindService:(NSNetService*)service moreComing:(BOOL)moreComing {
    [service setDelegate:self];
    [service resolveWithTimeout:0.0];
    [self.services addObject:service];

    if (!moreComing) {
        [self sortAndUpdateUI];
    }
}
于 2012-09-11T09:03:32.877 に答える