使用 NWPathMonitor 和 BehaviorSubject 来监控网络连接

瓦希德

我需要一个观察者来让我的应用程序更新设备的连接状态。

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)
丹尼尔·T。

我没有看到与您相同的类行为,但一个简单的解决方案是使用.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

何时使用Subject,BehaviorSubject和真实示例

如何将 NWPathMonitor 与 Alamofire 一起使用?

如何使用BehaviorSubject来检测变化

在Swift中使用可达性,NSNotification和网络链接调节器检测网络连接变化

如何在Oracle Virtual Box中使用静态IP在主机和来宾之间创建网络连接

过滤和转换rxjs BehaviorSubject

BehaviorSubject 和 concatMap 的副作用

如何使用ansible测试网络连接?

使用VBScript检查网络连接

使用外部网络连接Docker容器

SETEX错误-“使用封闭的网络连接”

使用UNC路径取消网络连接

Livepatch 错误:...使用关闭的网络连接

网络礼节,查验,网络连接和DDOS

如何在Angular 2中使用getter和setter实现BehaviorSubject

在Angular Services中使用BehaviorSubject?

使用自己的数据更新 BehaviorSubject

使用BehaviorSubject更改值的利弊

Unity3d WWW和网络连接错误

确定网络连接带宽(速度)wifi和移动数据

Android:处理网络连接和列表视图

使用iOS 10.3.3设备的Xcode 11,“设备和模拟器”对话框中没有“通过网络连接”

RxJS:BehaviorSubject和groupBy运算符

如何取消订阅PublishSubject和BehaviorSubject?

读取和更新BehaviorSubject值的最佳方法

Subject和BehaviorSubject有什么区别?

无法以角度获取和设置 BehaviorSubject 的值

在rxjs中,使用BehaviorSubject来存储数据与javascript对象相比是否有开销?

类的Set引发无法使用BehaviorSubject和Observable调用类型缺少调用签名的表达式