【问题标题】:NSNetServiceBrowser delegate not called when searching搜索时未调用 NSNetServiceBrowser 委托
【发布时间】:2010-08-19 22:04:49
【问题描述】:

我遇到了一个非常烦人的问题。我试图搜索 NSNetService(我知道存在)。我已将 http://www.macresearch.org/cocoa-scientists-part-xxviii-bonjour-and-how-do-you-do 中的示例代码复制到我自己的应用程序中。我可以看到(在示例程序中)我的服务已创建。但是当我点击搜索并开始 NSNetServiceBrowser 搜索时,什么也没有发生。新的委托函数被调用

 -(void)netServiceBrowser:(NSNetServiceBrowser *)aBrowser didFindService:(NSNetService *)aService moreComing:(BOOL)more {

我一直在检查我的对象是否仍然保留,但我看不到任何东西被释放(而且我没有开启 GC)。有人知道该怎么做吗?代码与示例中的代码完全相同,只是我在它周围有一些其他的东西(运行一个 openGL 窗口)。

【问题讨论】:

  • 您确定已将正确的委托分配给 NSNetServiceBrowser 的实例吗?
  • 我也有同样的问题。但是只有在我发布服务并从同一设备搜索它时才会调用它,但是在使用两台设备测试它时永远找不到该服务。

标签: objective-c cocoa nsnetservice nsnetservicebrowser


【解决方案1】:

这个问题已经很久了(iOS 4/5 时代?)所以我不确定这是否适合您,但请确保您仅在应用程序的主线程中使用 NSNetServiceBrowser。

(我不记得它是否也必须在主线程上初始化,或者它是否必须被初始化并从同一个线程调用 -search,或者它是否足以从主线程调用 -search,但我遇到了完全相同的问题,在我的情况下,它与以某种方式使用后台线程有关。抱歉答案含糊。)

【讨论】:

  • 刚刚自己测试过,你也需要从主线程本身初始化 NSNetService。仅在主线程中分配委托并执行诸如 NSNetService 的“searchForServicesOfType...”之类的调用是行不通的。我把网络服务的东西扔进了 dispatch_async(dispatch_get_main_queue(), ^{ ... });块。
  • 其实你不需要在主线程上使用NSNetService。您确实需要确保在您正在初始化 NSNetService 的线程上调用 [[NSRunLoop currentRunLoop] run] 。主runloop默认运行,其他线程可能不运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2016-04-06
  • 2014-03-18
  • 2019-08-11
相关资源
最近更新 更多