我有以下代码可用于发现网络上的服务:

[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。

更新:
这是与我的问题有关的更多信息。



更多内容:https://devforums.apple.com/message/541436

最佳答案

我确信它在Lion中不再为NSStreamEventEndEncountered事件调用处理程序。因此,当您确定已收到所有数据时,需要关闭输入流并将其从循环中删除。例如,当NSStreamEventHasBytesAvailable发生时。检查出来,我认为它应该工作

09-07 11:58