我有一个名为NetworkPathMonitor的简单类,如下所示:
class NetworkPathMonitor: ObservableObject, Cancellable {
@Published var path: NWPath? = nil
let monitor = NWPathMonitor()
init() {
monitor.pathUpdateHandler = { [weak self] path in
DispatchQueue.main.async {
self?.path = path
}
}
monitor.start(queue: DispatchQueue.global(qos: .background))
}
func cancel() {
monitor.cancel()
}
deinit {
cancel()
}
}
Run Code Online (Sandbox Code Playgroud)
尽管pathUpdateHandler在我禁用和启用 WiFi 时调用,但结果并不总是可靠。当我禁用 WiFi 时,当前路径是unsatisfied (No network route),但是当我再次启用 WiFi 时,它会pathUpdateHandler再次使用相同的路径进行呼叫unsatisfied (No network route)。
然而,在我的用户界面中,我有一个“重试”按钮。当我按下它时,它将销毁当前的监视器并建立一个新的监视器。第一条消息现在说satisfied (Path is satisfied), interface: en0。这意味着,WiFi 可能需要一些时间才能建立网络路由,但当网络可用时,它不会pathUpdateHandler再次呼叫。
我注意到start(queue:)中的方法NWPathMonitor需要类型为 的队列DispatchQueue。有没有办法使用 Swift 现代并发来实现这一点,可能使用AsyncStream?
使用Apple文档AsyncStream,我已经创建了扩展NWPathMonitor,但我无法启动NWPathMonitor显示器,任何建议将不胜感激,谢谢
extension NWPathMonitor {
static var nwpath: AsyncStream<NWPath> {
AsyncStream { continuation in
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
continuation.yield(path)
}
continuation.onTermination = { @Sendable _ in
monitor.cancel()
}
// monitor.start(queue: )
}
}
}
Run Code Online (Sandbox Code Playgroud)
阅读苹果的文档
我想知道 Wi-Fi 是否有互联网连接。有时我们的设备已连接 Wi-Fi,但 Wi-Fi 没有互联网连接。
NWPathMonitor 或 Connectivity 第三方。我尝试过,但这并不是万无一失的。
我知道我可以编写一个方法来 ping 服务器,但这是一件非常低效且成本高昂的事情。
有任何想法吗?