swiftui - ObservableObject with NWPathMonitor
问题描述
I try to make NWPathMonitor an observable object that returns true if there is a network connection and false if not.
Can you help me because my solution doesn't work.
Thanks
import Foundation
import Network
class TestNetStatus: ObservableObject {
let monitor = NWPathMonitor()
let queue = DispatchQueue.global(qos: .background)
@Published var connected: Bool = false
private var isConnected: Bool = false
init() {
monitor.start(queue: queue)
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
self.isConnected = true
} else {
self.isConnected = false
}
}
self.connected = isConnected
}
}
解决方案
you have to set the published variable on the main thread
class TestNetStatus: ObservableObject {
let monitor = NWPathMonitor()
let queue = DispatchQueue.global(qos: .background)
@Published var connected: Bool = false
private var isConnected: Bool = false
init() {
monitor.start(queue: queue)
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
OperationQueue.main.addOperation {
self.isConnected = true
self.connected = self.isConnected
}
} else {
OperationQueue.main.addOperation {
self.isConnected = false
self.connected = self.isConnected
} }
}
}
}
struct ContentView: View {
@EnvironmentObject var data : TestNetStatus
var body: some View {
VStack {
Text ("Status")
Text(data.connected ? "Connected" : "not connected")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(TestNetStatus())
}
}
推荐阅读
- c# - ASP.net Core 2.0 不支持 WindowsBase dll
- amazon-web-services - 使用 AWS Amplify(或 aws-sdk)获取 Cognito 用户的“创建”时间?
- angular - 如何在 Angular 中隐式声明公共属性?
- java - 如何在powershell中传递字符串常量
- flutter - Flutter 与 React Native 或 NativeScript 等其他技术相比如何?
- ios - iOS 恢复 HLS 下载并删除部分下载的文件
- azure - 从 Azure 机器学习服务工作区拉取 Docker 映像
- python - 如何在函数中使用 destroy() 关闭窗口?
- python - 在我的 urls.py 文件中定义了一个 ajax 函数,但在测试中调用它时得到 404
- javascript - 更改下拉菜单的值