NSNetServiceBrowser didRemoveService занимает больше времени после открытия потока

У меня есть следующий код для обнаружения служб в сети:

[netServiceBrowser setDelegate: self]; 
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];

Это приводит к вызовам этих двух методов (найти службу и удалить службу):

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
         didFindService:(NSNetService*) netService ... {}

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
         didRemoveService:(NSNetService*) netService ... {}

Это отлично работает. Когда я выключаю свое устройство, я немедленно получаю вызов didRemoveService .

Однако когда я открываю поток (ввод, вывод или оба) на устройство:

[netService getInputStream: &inputStream outputStream: &outputStream];

[inputStream setDelegate: self];
[outputStream setDelegate: self];

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
             forMode: NSDefaultRunLoopMode];
[inputStream open];

[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
              forMode:NSDefaultRunLoopMode];
[outputStream open];

Он внезапно NSNetServiceBrowser почти за минуту обнаруживает, что я выключил устройство
(для вызова didRemoveService требуется минута).

Устройства, с которыми я не общаюсь (открывающие потоки), по-прежнему вызывают didRemoveService , как только я их удаляю.

Обновление: Вот немного дополнительной информации, связанной с моей проблемой.

Я провел трассировку с помощью Wireshark и заметил следующее:

Я запускаю свое приложение в симуляторе iPad, приложение запускает NSNetServiceBrowser и обнаруживает принтер. После этого открывается потоки ввода / вывода на устройство (через airport express, usb). В принтер отправляет мне обновления статуса, и когда я нажимаю кнопку тестирования в мое приложение принтер начинает печать. В Wireshark я вижу все связь с принтером, как ожидалось.

Теперь, когда я запускаю то же самое приложение на iPad (и оставляю Симулятор iPad запущен).Приложение запускает NSNetServiceBrowser также обнаруживает принтер. Принтер не отправляет мне обновления статуса, и когда я нажимаю кнопку тестирования, принтер не печатает. В Wireshark я вижу общение. В принтер или аэропорт получает мои команды и отправляет пакет ACK.

Как только я закрываю приложение-симулятор iPad, принтер начинает печатать команды, которые я отправил с iPad. Кажется, что открытие сокета блокирует все события Bonjour, как я могу предотвратить это?

Подробнее здесь: https://devforums.apple.com/message/541436

7
задан Zyphrax 26 November 2011 в 13:22
поделиться