後需要更長的時間我都在網絡上發現服務下面的代碼: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並檢測打印機。之後,它打開 輸入/輸出流到設備(通過機場快車,USB)。 打印機發送狀態更新,當我點擊 我的應用程序中的測試按鈕時,打印機開始打印。在Wireshark中,我可以按預期的方式看到與打印機的所有 通信。
現在,當我開始在iPad上完全相同的應用程序(並保持運行iPad模擬器 )。應用程序也會啓動 NSNetServiceBrowser,並檢測打印機。打印機是 不向我發送狀態更新,當我點擊測試按鈕時, 打印機未打印。在Wireshark中,我看到了溝通。打印機或機場接收到我的命令併發送一個ACK包。
只要我殺了iPad模擬器應用程序,打印機就開始打印 我使用iPad發送的命令。看來,打開一個插座阻止所有bonjour事件,我怎樣才能防止這種情況發生?
這裏更多:https://devforums.apple.com/message/541436
只要關閉流,didRemoveService就會觸發。它似乎在等待某種超時? – Zyphrax
我不確定是否是這種情況,但看看你的 - (無效)流:(NSStream *)aStream handleEvent:(NSStreamEvent)事件處理程序。在Lion中,處理程序不再爲NSStreamEventEndEncountered事件調用。因此,當您確定收到所有數據時,您需要關閉輸入流並將其從循環中移除。例如,當NSStreamEventHasBytesAvailable發生時。 – Davyd
適用於有權訪問Apple Developer論壇的用戶。我在這裏發佈了我的問題:https://devforums.apple.com/message/541436。遺憾的是仍然沒有解決方案:( – Zyphrax