- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Rx 的新手,一直在尝试制作一个解析服务的 Bonjour 发现客户端。这是非常简单的命令式操作,但我想尝试使用 RxSwift。
由于发现的 NSNetService 对象需要在解析之前持久化,所以我必须进行嵌套订阅调用,外层用于发现,内层 on 用于解析……但有些事情告诉我这不是最好的方式。
import UIKit
import RxSwift
class BonjourClient: NSObject {
let disposeBag = DisposeBag()
var servicesArray = [NSNetService]()
func startBrowsing() {
let browser = NSNetServiceBrowser()
browser.rx_netServiceBrowserDidFindServiceMoreComing
.subscribeNext { (service: NSNetService) in
self.servicesArray.append(service)
self.servicesArray.last!.rx_netServiceDidResolveAddress
.subscribeNext { (sender: NSNetService) in
print("Resolved \(sender.name)")
let data = sender.TXTRecordData()
let dict: [String: NSData?] = NSNetService.dictionaryFromTXTRecordData(data!)
for (key, value) in dict {
print("\(key) : \(String(data: value!, encoding: NSUTF8StringEncoding)!)")
}
}.addDisposableTo(self.disposeBag)
self.servicesArray.last!.resolveWithTimeout(5)
}.addDisposableTo(disposeBag)
browser.searchForServicesOfType("_amzn-wplay._tcp.", inDomain: "local.")
NSRunLoop.currentRunLoop().run()
}
}
我的代理类如下:
import UIKit
import RxSwift
import RxCocoa
class RxNSNetServiceBrowserDelegateProxy: DelegateProxy, NSNetServiceBrowserDelegate, DelegateProxyType {
static func currentDelegateFor(object: AnyObject) -> AnyObject? {
let browser: NSNetServiceBrowser = object as! NSNetServiceBrowser
return browser.delegate
}
static func setCurrentDelegate(delegate: AnyObject?, toObject object: AnyObject) {
let browser: NSNetServiceBrowser = object as! NSNetServiceBrowser
browser.delegate = delegate as? NSNetServiceBrowserDelegate
}
}
class RxNSNetServiceDelegateProxy: DelegateProxy, NSNetServiceDelegate, DelegateProxyType {
static func currentDelegateFor(object: AnyObject) -> AnyObject? {
let service: NSNetService = object as! NSNetService
return service.delegate
}
static func setCurrentDelegate(delegate: AnyObject?, toObject object: AnyObject) {
let service: NSNetService = object as! NSNetService
service.delegate = delegate as? NSNetServiceDelegate
}
}
extension NSNetServiceBrowser {
public var rx_delegate: DelegateProxy {
return proxyForObject(RxNSNetServiceBrowserDelegateProxy.self, self)
}
public var rx_netServiceBrowserDidFindServiceMoreComing: Observable<NSNetService> {
return rx_delegate.observe("netServiceBrowser:didFindService:moreComing:")
.map { params in
let service = params[1] as! NSNetService
return service
}
}
}
extension NSNetService {
public var rx_delegate: DelegateProxy {
return proxyForObject(RxNSNetServiceDelegateProxy.self, self)
}
public var rx_netServiceDidResolveAddress: Observable<NSNetService> {
return rx_delegate.observe("netServiceDidResolveAddress:")
.map { params in
return params[0] as! NSNetService
}
}
}
如果我在 browser.rx_netServiceBrowserDidFindServiceMoreComing
调用之后使用 flatMap
而不是 subscribeNext
,服务将无法解析,因为我无法坚持它从 flatMap
中转移到一个数组中,原因让我难以理解,主要是因为我从未接触过 Rx。我一定要使用嵌套调用吗?
我的问题的简短版本是上面的作品,但对我来说似乎很费解。任何想法将不胜感激。
最佳答案
您可以使用scan
来避免嵌套订阅。它会将 rx_netServiceBrowserDidFindServiceMoreComing
中的每个 NSNetService
添加到数组中。请注意,在这种情况下,您不必将 servicesArray
存储为成员变量,除非您出于其他原因需要它。
然后你可以使用flatMap
如下:
browser.rx_netServiceBrowserDidFindServiceMoreComing
.scan([NSNetService]()) { (services: [NSNetService], service: NSNetService) in
return services + [service]
}.flatMap { (services: [NSNetService]) in
return services.last!.rx_resolveWithTimeout(5)
}.subscribeNext { (sender: NSNetService) in
print("Resolved \(sender.name)")
let data = sender.TXTRecordData()
let dict: [String: NSData?] = NSNetService.dictionaryFromTXTRecordData(data!)
for (key, value) in dict {
print("\(key) : \(String(data: value!, encoding: NSUTF8StringEncoding)!)")
}
}.addDisposableTo(disposeBag)
这需要在 NSNetService
扩展中添加一个方法,因为您必须从 flatMap
返回一个 Observable
:
extension NSNetService {
//existing methods omitted
public func rx_resolveWithTimeout(timeout: NSTimeInterval) -> Observable<NSNetService> {
self.resolveWithTimeout(timeout)
return rx_netServiceDidResolveAddress.filter {
$0 == self
}
}
}
关于swift - Bonjour Discovery 的 RxSwift 和嵌套订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858805/
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我想开发一个可以运行的 Android 应用程序 黑莓剧本。应用程序需要找到其他 本地网络上运行相同应用程序的设备。 我正在考虑实现 Bonjour/Zeroconf/jmDNS 用于查找设备的协议(
通过DNS-SD发现服务后,该主机的地址将如何准确解析,并且花费的时间/开销会大大增加吗? 另外,如果我使用的是JmDNS或Bonjour,则有serviceFound和serviceResolved
我的问题是关于“本地网络上文件服务器服务的自动发现”。 我想实现一个基本上是文件服务器的服务并将其发布在本地网络上。连接到本地网络的客户端 PC 应该自动找到该服务并映射(挂载)网络驱动器,无需用户干
有没有一种简单的方法可以扫描给定网络的Bonjour/Zeroconf服务? 我有一组计算机(Linux,Windows,Apple),并且想自动生成Intranet中所有可用的具有Zeroconf功
谁能解释一下从 iPhone OS 3.0 开始,bonjour 如何通过蓝牙工作? 文档称,即使 Wi-fi 关闭且蓝牙打开,应用程序中使用的 Bonjour API 也能正常工作。它还表示,蓝牙
我正在开发一个 iPhone 应用程序,它允许用户使用 Bonjour 协议(protocol)连接到其他 iPhone。其中一个用户托管服务器并发布他的 bonjour 服务,而其他客户端用户发现他
Bonjour 提供“DNSSSD.browse(serviceType,callBackObject)”方法来浏览特定类型的服务。如果找到给定类型的服务,Bonjour 将调用“callBackOb
Bonjour 是否允许一台 iOS 设备同时向多台 iOS 设备发送数据或图像? I am able to detect number of iOS devices over a wifi netw
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,vis
我正在尝试在 Swift3 中实现 Bonjour NetServiceBrowser,以便在我的网络上发现主机。 当我使用以下命令在终端中手动搜索时,我会找到主机。 dns-sd -B 但是,当我尝
这看起来太基础了,以至于人们会为它大喊大叫,在网络上搜索一无所获,但我已经在多个网络和计算机上对其进行了测试。我们遇到一个问题,我们使用 .local url 访问资源非常慢。如果我们使用直接 IP
我注意到 Pasteboard 是一款适用于 iOS 的剪贴板应用程序,它可以在后台运行 Bonjour 服务。我不知道他们是如何实现的,所以我在互联网上搜索,然后发现它在后台播放无声文件。但现在不是
我知道 iOS 的 Bonjour 实现(NSNetService、NSNetServiceBrowser)在本地网络上开箱即用。 文档说可以设置 Bonjour DNS 服务器以允许通过 Inter
我想写一个可以搜索Bonjour的C程序网络上启用的设备。 基本上我们有一个网络摄像机,它支持 Bonjour 协议(protocol)。我想用 C 编写 API,可以搜索这些启用了 Bonjour
使用jmdns 3.4.1,我可以看到局域网中机器发布的服务,我也可以创建一个服务并注册它,这样我就可以在我的机器上看到它。但是,当我在局域网的另一台机器上新建服务时,在我的机器上是看不到的。我在另一
我正在编写一个可以在电脑和手机上运行的软件。 该服务使用 HTTP API 进行通信,并将使用 Zeroconf 通过本地网络发布。 最初我使用 _http._tcp. 发布了我的服务作为服务类型,但
我想知道是否可以在 iPhone OS 3.0 或更高版本中直接通过蓝牙使用 bonjour,而不使用 GameKit。谁能提供一些例子吗? 最佳答案 只需宣布服务即可,就像 tc. has said
问题说明了一切。 有人可以告诉我这是否可能以及如何实现吗? 我已经有了我想要 bonjour 名称的设备的 IP 地址和 MAC 地址... 最佳答案 假设您正在查找 .local 域中的计算机,并且
我正在尝试调试 Bonjour 网络例程,每次运行它时,Mac 的防火墙都会询问“您希望应用程序 ProjectName 接受传入的网络连接吗?” 我单击“允许”,为其提供管理员名称和密码,然后该应用
我是一名优秀的程序员,十分优秀!