我有以下代码可用于发现网络上的服务:
[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发生时。检查出来,我认为它应该工作