7

後需要更長的時間我都在網絡上發現服務下面的代碼: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

+0

只要關閉流,didRemoveService就會觸發。它似乎在等待某種超時? – Zyphrax

+0

我不確定是否是這種情況,但看看你的 - (無效)流:(NSStream *)aStream handleEvent:(NSStreamEvent)事件處理程序。在Lion中,處理程序不再爲NSStreamEventEndEncountered事件調用。因此,當您確定收到所有數據時,您需要關閉輸入流並將其從循環中移除。例如,當NSStreamEventHasBytesAvailable發生時。 – Davyd

+0

適用於有權訪問Apple Developer論壇的用戶。我在這裏發佈了我的問題:https://devforums.apple.com/message/541436。遺憾的是仍然沒有解決方案:( – Zyphrax

回答

0

這似乎是機場快車的限制。

我現在使用GCDAsyncSocket的實現工作得很好,我只需要確保只有一個套接字用於與機場快車進行通信。

我正在結束這個問題。

0

我相信它在獅子的處理程序沒有呼籲NSStreamEventEndEncountered事件了。因此,當您確定收到所有數據時,您需要關閉輸入流並將其從循環中移除。例如,當NSStreamEventHasBytesAvailable發生時。檢查出來,我想它應該工作

+0

不幸的是,我不得不保持輸入流爲設備更新打開(打印機沒有紙張,托盤打開等)。這個問題發生在Snow Leopard,iOS,Lion並不重要。 – Zyphrax