【发布时间】:2017-02-16 11:12:31
【问题描述】:
我正在尝试在 Swift3 中实现 Bonjour NetServiceBrowser,以便发现我网络上的主机。
当我使用以下命令在终端中手动搜索时,我会找到主机。
dns-sd -B
但是,当我尝试在 Swift 中使用 NetServiceBrowser(参见下面的代码)时,它只会打印“开始搜索..”。我按照Bonjour documentation实现了这个类。
我不明白出了什么问题。 Bonjour 对 Swift 的工作方式是否不同?我在网上找不到工作示例。我尝试了domain 的几个变体(“local”、“local.”、“”)或name 的几个变体。
class ZeroConf: NSObject, NetServiceBrowserDelegate, NetServiceDelegate{
var browser: NetServiceBrowser!
var services = [NetService]()
let domain = "local"
let name = "_http._tcp"
func startSearch(){
self.services.removeAll()
self.browser = NetServiceBrowser()
self.browser.delegate = self
self.browser.searchForServices(ofType: name, inDomain: domain)
}
func netService(_ sender: NetService, didNotPublish errorDict: [String : NSNumber]) {
debugPrint(errorDict)
}
func netServiceBrowserWillSearch(_ browser: NetServiceBrowser) {
print("starting search..")
}
func netServiceBrowserDidStopSearch(_ browser: NetServiceBrowser) {
print("Stoped search")
}
func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) {
print("error in search")
debugPrint(errorDict)
}
func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) {
print("found service")
services.append(service)
debugPrint(service)
}
func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) {
if let ix = self.services.index(of:service) {
self.services.remove(at:ix)
print("removing a service")
}
}
func netServiceDidResolveAddress(_ sender: NetService) {
print("did resolve address")
}
}
【问题讨论】:
-
看起来很蹩脚,但服务数组是否已分配?
-
该代码应该可以工作。但是,如果您在 Playground 中运行它,由于异步行为,您需要启用
needsIndefiniteExecution或PlaygroundSupport。 -
@ystack 是的,它与声明在同一行分配
-
@vadian 不,它不在操场上
-
我刚刚将代码复制到了一个游乐场,它按预期工作。