删除后,NetServiceBrowser会提供不同的NetService

时间:2011-12-12 06:48:02

标签: ios nsnetservicebrowser

我希望能做到这样的事情:

netServiceBrowser:didFindService:moreComing:

[self.foundServices addObject:aNetService];

并在netServiceBrowser:didRemoveService:moreComing:

[self.foundServices removeObject:aNetService];

但是,返回的服务不会被NetServiceBrowser保留,因此didRemoveService中给出的服务与数组中的服务不同。如何比较服务以确保我删除的服务是正确的?

2 个答案:

答案 0 :(得分:5)

你过度思考这个问题,并在脑海中创造一个不存在的问题。对传递给removeObject:的对象使用didRemoveService:removeObject:根据对象对isEqual:的响应而删除,而不是对象的地址或标识。所以这才会奏效。

答案真的很简单:

[self.foundServices removeObject:aNetService];

Apple对removeObject:的描述解释了这一点:

  

此方法使用indexOfObject:查找匹配项,然后使用removeObjectAtIndex:删除它们。因此,匹配是根据对象对isEqual:消息的响应来确定的。

(为了完整起见,Apple 确实提供了一个按地址删除对象的功能。那就是removeObjectIdenticalTo:。但这不是你想要的行为。只需使用removeObject: 。)

参考文献:

答案 1 :(得分:0)

简短的回答,我最终不得不使用它,但我再也无法重现这个问题了。使用选定的答案。

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    [self.foundServices addObject:aNetService];
}


- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    NSNetService *found = nil;

    for(NSNetService *ns in self.foundServices) {
        if([ns isEqualTo:aNetService]) {
            found = ns;
        }
    }

    if(found) {
        [self.foundServices removeObject:found];
    }
}