Делегаты NSNetService не звонят

Я пытаюсь разрешить 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

Здесь странная часть: ни методы делегата не вызываются, если я не запускаю NSAlert после "[service resolveWithTimeout: 5];". Любые идеи?

Ответ 1

Если вы используете ARC, вам нужно где-то сохранить служебный объект. В вашем примере объект службы, скорее всего, выходит за пределы области действия и не упоминается нигде в вашем коде, поэтому компилятор попытается освободить его сразу после вызова разрешения.

Добавить объект:

@property (nonatomic, strong) NSMutableArray *services;

В вашем делегате или где вы используете NSNetService

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
           didFindService:(NSNetService *)aNetService
               moreComing:(BOOL)moreComing
{
    if (!self.services) {
        self.services = [[NSMutableArray alloc] init];
    }
    [self.services addObject:aNetService];
    [aNetService setDelegate:self];
    [aNetService resolveWithTimeout:3.0];
}

Не забудьте остановить и освободить эти службы после завершения или избавления от делегата:

for (NSNetService* service in self.services) {
    [service stop];
}
[self.services removeAllObjects];

Ответ 2

Я не уверен, но похоже, что запрос по-настоящему не запланирован в цикле запуска. Возможно, попробуйте что-то вроде this, чтобы запланировать его?

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 или используете только методы?

EDIT: У меня было другое мнение, что это может быть какое-то состояние гонки (более вероятный сценарий). Делегаты обычно являются слабыми ссылками. Если ваш объект выходит из области действия и автореализован, система будет иметь ручку nil и будет обводить сообщения в нуль. В случае, когда вы показываете NSAlert (или выполняете другую работу), ваш объект может зависеть только достаточно долго, чтобы он мог вернуть сообщения к нему. Не могли бы вы подтвердить, что ваш объект хранится в течение 8 секунд?