Я пытаюсь выполнить Bonjour для разрешения имени службы синхронно, поэтому я пытаюсь выяснить, как правильно ожидать вызова netServiceDidResolveAddress () NSNetService.
Мой код выглядит так:
service = [[NSNetService alloc] initWithDomain:@"local." type:@"_myservice._tcp" name:[self name]];
[service retain];
[service setDelegate:self];
waitingOnResolution = true;
[service resolveWithTimeout:5.0];
for (int i=0;i<5;i++) {
DebugLog(@"resolve: resolve iteraton %u\n", i);
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; // run loop for one second
DebugLog(@"resolve: resolve iteraton %u (after run loop)\n", i);
if (!waitingOnResolution) break;
}
// continue processing...
А вот моя функция, которая обрабатывает разрешение разрешения:
- (void)netServiceDidResolveAddress:(NSNetService *)sender
{
// do processing...
waitingOnResolution = false;
CFRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]); // has no effect
}
До тех пор, пока мой код продолжает работать примерно секунду после события разрешения, я буду счастлив.
Что на самом деле происходит, так это то, что разрешение происходит довольно быстро, и я вижу, что код в netServiceDidResolveAddress () завершен, но затем постоянно происходит нежелательное 5–6-секундное ожидание, пока элемент управления не возвращается из runUntilDate, и я вижу «... (после цикла выполнения) оператор отладки.
Я огляделся на нескольких досках объявлений и увидел похожие вопросы, но их решения (такие как использование CFRunLoopStop), похоже, не имеют никакого эффекта.
Вот пример регистрации, которую я получаю:
2011-07-11 09:38:07.267 MyProgram[1822:707] resolve: resolve iteraton 0
2011-07-11 09:38:07.299 MyProgram[1822:707] netService: netServiceDidResolveAddress function ended
[5+ second delay]
2011-07-11 09:38:12.907 MyProgram[1822:707] resolve: resolve iteraton 0 (after run loop)
Если кто-то может рассказать мне о другом способе использования разрешения NSNetService для получения синхронного результата или рефакторинга моего кода, связанного с runloop, чтобы избежать этой (казалось бы, созданной ОС) задержки 5-6 секунд, я был бы признателен.