При проверке наличии Интернета выводятся обратные значения

Имеется такая программа

import Foundation
import Network
import SwiftUI


class Network : ObservableObject {
    static let network = Network()
    
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "Monitor")
    private(set) var connected: Bool = false
    
    private init () {}
    
    private var path: NWPath?
    
    func runCheckConnection() {
        monitor.start(queue: queue)
        
        monitor.pathUpdateHandler = { path in
            
            self.path = path
            
            if path.status == .satisfied {
                self.connected = true
                print("Connect true")
            } else if path.status == .unsatisfied {
                self.connected = false
                print("Connect false")
            } else {
                print("Connect false+")
            }
            
            if path.usesInterfaceType(.wifi) {
                print("Connection type wifi")
            } else if path.usesInterfaceType(.cellular) {
                print("Connection type cellular")
            } else {
                print("Connection type none")
            }
        }
        
    }
    
    func isOnline() -> Bool {
        return connected
    }
}


@main
struct testApp: App {
    @State var btn2 = ""
    
    init () {
        Network.network.runCheckConnection()
        //btn2 = Network.network.isOnline()
    }

    var body: some Scene {
        WindowGroup {
            Button(action: {
                btn2 = Network.network.isOnline() ? "1" : "0"
                
            }) {
                Text("Internet \(btn2)")
                    .frame(width: 200, height: 40)
            }
        }
    }
}

Здесь проблема в том, что когда wifi включен выводится значение, что Интернета нету, а когда wifi выключен что Интернет в наличии. Почему так?


Ответы (1 шт):

Автор решения: schmidt9

Немного переписал Ваш пример, сделав динамическое обновление данных с помощью @Published/@ObservedObject, теперь надпись на кнопке автоматически обновляется при включении/отключении интернета. Рекомендую изучить тему работы c асинхронными операциями в SwiftUI

import Foundation
import Network
import SwiftUI


class Network : ObservableObject {
    static let network = Network()
    
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "Monitor")
    
    @Published var connected: Bool = false
    
    private init () {}
    
    private var path: NWPath?
    
    func runCheckConnection() {
        monitor.start(queue: queue)
        
        monitor.pathUpdateHandler = { path in
            
            self.path = path
            
            DispatchQueue.main.async {
                if path.status == .satisfied {
                    self.connected = true
                    print("Connect true")
                } else if path.status == .unsatisfied {
                    self.connected = false
                    print("Connect false")
                } else {
                    print("Connect false+")
                }
                
                if path.usesInterfaceType(.wifi) {
                    print("Connection type wifi")
                } else if path.usesInterfaceType(.cellular) {
                    print("Connection type cellular")
                } else {
                    print("Connection type none")
                }
            }
            
        }
        
    }
}

@main
struct testApp: App {
    @ObservedObject var network = Network.network
    
    var body: some Scene {
        WindowGroup {
            Button(action: {
            }) {
                let connected = network.connected
                Text("Internet \(connected ? 1 : 0)")
                    .frame(width: 200, height: 40)
            }.onAppear {
                network.runCheckConnection()
            }
        }
    }
}
→ Ссылка