我需要一个观察者来让我的应用程序更新设备的连接状态。
NWPathMonitor
似乎是标准方法。所以我是这样的:
class NetworkService {
let monitor = NWPathMonitor()
let connected = BehaviorSubject(value: true)
private init() {
monitor.pathUpdateHandler = { path in
let value = path.status == .satisfied
self.connected.onNext(value)
}
let queue = DispatchQueue(label: "NetworkMonitor")
monitor.start(queue: queue)
}
}
这是我订阅的地方 connected
NetworkService.shared.connected.subscribe(onNext: { connected in
print("network connected: \(connected)")
}).disposed(by: disposeBag)
应用程序一启动,onNext
就开始疯狂地启动,充斥着控制台,network connected: true
直到应用程序崩溃。
我尝试添加一个本地缓存变量,以便onNext
仅当值发生更改时才会触发该部分。
if (value != self.previousValue) {
self.previousValue = value
self.connected.onNext(value)
}
同样的事情仍然发生。所以我猜想监视器可能更新得太频繁以至于无法分配缓存变量,我尝试添加一个信号量......
self.semaphore.wait()
if (value != self.previousValue) {
self.previousValue = value
self.connected.onNext(value)
}
self.semaphore.signal()
和没有帮助的事件。仍然收到大量打印消息,应用程序崩溃。
顺便说一句,如果你想知道我是如何在课堂上声明信号量的:
let semaphore = DispatchSemaphore( value: 1)
我没有看到与您相同的类行为,但一个简单的解决方案是使用.distinctUntilChanged()
它会阻止事件传播,除非它与前一个事件不同。
如果上述内容不能阻止事件的泛滥,那么问题不在于您提供的代码,而在于您没有告诉我们的其他内容。
另外,我会这样写:
extension NWPathMonitor {
var rx_path: Observable<NWPath> {
Observable.create { [self] observer in
self.pathUpdateHandler = { path in
observer.onNext(path)
}
let queue = DispatchQueue(label: "NetworkMonitor")
self.start(queue: queue)
return Disposables.create {
self.cancel()
}
}
}
}
有了上述内容,可以通过以下方式轻松访问:
let disposable = NWPathMonitor().rx_path
.map { $0.status == .satisfied }
.debug()
.subscribe()
订阅将使 NWPathMonitor 对象在订阅期间保持活动状态。在一次性对象上调用 dispose() 将关闭订阅并释放 NWPathMonitor 对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句