ObservableObject с NWPathMonitor - PullRequest
       81

ObservableObject с NWPathMonitor

0 голосов
/ 06 мая 2020

Я пытаюсь сделать NWPathMonitor наблюдаемым объектом, который возвращает true, если есть сетевое соединение, и false, если нет.

Можете ли вы мне помочь, потому что мое решение не работает.

Спасибо

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
    }
}

1 Ответ

1 голос
/ 06 мая 2020

вы должны установить опубликованную переменную в основном потоке

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())
    }
}

enter image description here

...