NetServiceBrowser дает другой NetService при удалении - PullRequest
3 голосов
/ 12 декабря 2011

Я надеялся сделать что-то вроде этого:

В netServiceBrowser:didFindService:moreComing:

[self.foundServices addObject:aNetService];

И в netServiceBrowser:didRemoveService:moreComing:

[self.foundServices removeObject:aNetService];

Однако службы вернулисьне сохраняются NetServiceBrowser, и поэтому служба, указанная в didRemoveService, отличается от объекта в массиве.Как сравнить сервисы, чтобы убедиться, что тот, который я удаляю, является правильным?

Ответы [ 2 ]

5 голосов
/ 29 мая 2012

Вы слишком обдумываете это и создаете проблему в своей голове, которой не существует.Используйте removeObject: для объекта, переданного в didRemoveService:.removeObject: удаляет на основе ответа объекта на isEqual:, а не адреса или идентификатора объекта.Так что это будет просто работать.

Ответ на самом деле так же прост, как:

[self.foundServices removeObject:aNetService];

Описание Apple removeObject: объясняет это:

Этот метод используетindexOfObject:, чтобы найти совпадения и затем удалить их, используя removeObjectAtIndex:.Таким образом, совпадения определяются на основе ответа объекта на сообщение isEqual:.

(Для полноты, Apple предлагает функцию, которая удаляет объект по адресу.Это removeObjectIdenticalTo:. Однако это не то поведение, которое вам здесь нужно. Просто используйте removeObject:.)

Ссылки:

0 голосов
/ 29 мая 2012

Короткий ответ, мне пришлось использовать это, но я больше не могу воспроизвести проблему.Используйте выбранный ответ.

- (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];
    }
}
...