我试图在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];
}
}
答案 0 :(得分:7)
您需要先解决服务问题。在回调中,您所知道的是服务存在,但您没有其记录(既不是A也不是TXT)。
您可以使用-resolveWithTimeout:
来解决此问题。如果您需要在修改TXT记录时收到通知,也可以使用-startMonitoring
。
答案 1 :(得分: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被调用一次,它只解析数组self.services的最后一个元素(我有11个服务,它只解决索引为10的对象)。 我的问题是要解决所有服务。
答案 2 :(得分: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];
}
}