При проверке наличии Интернета выводятся обратные значения
Имеется такая программа
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()
}
}
}
}