Swift iOS13中的网络监视器崩溃
因此,我试图保持我目前在iOS 13+上的状态,同时引入一些iOS 14的功能。 新功能之一是监控用户是否失去网络连接 然而,当我运行下面的代码时,我遇到了一个奇怪的错误 TaView.swift(默认视图) 班长,斯威夫特Swift iOS13中的网络监视器崩溃,swift,xcode,swiftui,Swift,Xcode,Swiftui,因此,我试图保持我目前在iOS 13+上的状态,同时引入一些iOS 14的功能。 新功能之一是监控用户是否失去网络连接 然而,当我运行下面的代码时,我遇到了一个奇怪的错误 TaView.swift(默认视图) 班长,斯威夫特 import Network import SwiftUI // An enum to handle the network status enum NetworkStatus: String { case connected case disconnec
import Network
import SwiftUI
// An enum to handle the network status
enum NetworkStatus: String {
case connected
case disconnected
}
class Monitor: ObservableObject {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue(label: "Monitor")
@Published var score = 0
@Published var status: NetworkStatus = .connected
init() {
monitor.pathUpdateHandler = { [weak self] path in
guard let self = self else { return }
// Monitor runs on a background thread so we need to publish
// on the main thread
DispatchQueue.main.async {
if path.status == .satisfied {
print("We're connected!")
self.status = .connected
self.score = 1
} else {
print("No connection.")
self.score = 0
self.status = .disconnected
}
}
}
monitor.start(queue: queue)
}
}
错误是
线程1:信号SIGABRT
我想知道如何解决这个问题
将
@StateObject
更改为ObservedObject
效果非常好
注意:检查@availability
(向后兼容时)时,您不必总是在if
和else
中再次编写相同的代码,您只需为视图创建一个变量
并重用它,就像在本例中我们重用选项卡视图内容
struct TaView: View {
@ObservedObject var monitor = Monitor()
@ObservedObject var location = LocationManager()
@State var errorDetail = false
var lat: String{
return "\(location.lastKnownLocation?.coordinate.latitude ?? 0.0)"
}
var lon: String{
return "\(location.lastKnownLocation?.coordinate.longitude ?? 0.0)"
}
var state: String{
return "\(UserSettings().state)"
}
init() {
// print(self.data.connected)
self.location.startUpdating()
}
@ObservedObject var userSettings = UserSettings()
var tabViewContent: some View {
TabView {
ContentView()
.tabItem {
Image(systemName: "dot.radiowaves.left.and.right")
Text("Radio")
}
WinView()
.tabItem {
Image(systemName: "w.circle")
Text("Win")
}
SettingsView()
.tabItem {
Image(systemName: "gear")
Text("Settings")
}
}.accentColor(Color.red)
.onAppear(){
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
if monitor.score == 0{
self.errorDetail = true
} else {
self.errorDetail = false
}
//print("this is the score \(monitor.score)")
}
}
}
var body: some View {
if (self.lat == "0.0" && self.lon == "0.0"){
LocationDisabled()
}
else{
if #available(iOS 14.0, *) {
tabViewContent
.fullScreenCover(isPresented: self.$errorDetail, content: NetworkOutageView.init)
} else {
tabViewContent
.sheet(isPresented: self.$errorDetail, content: NetworkOutageView.init)
}
}
}
}
使用
Xcode 12.4
,在iOS13.3.1
和ios14.4.2
上测试,我无法重现此错误,您是否在模拟器上运行,这对我来说运行正常,在iOS14.4
和Xcode 12.4
上测试是的,它在iOS14+上运行良好,但不是ios13.6。请注意,此代码无法在ios13.6
上运行,因为您使用的是@StateObject
属性包装器,该包装器可从iOS14.0
及更高版本获得。请尝试改用@observeobject
。不知道是什么解决此问题的方法是使其向后兼容
struct TaView: View {
@ObservedObject var monitor = Monitor()
@ObservedObject var location = LocationManager()
@State var errorDetail = false
var lat: String{
return "\(location.lastKnownLocation?.coordinate.latitude ?? 0.0)"
}
var lon: String{
return "\(location.lastKnownLocation?.coordinate.longitude ?? 0.0)"
}
var state: String{
return "\(UserSettings().state)"
}
init() {
// print(self.data.connected)
self.location.startUpdating()
}
@ObservedObject var userSettings = UserSettings()
var tabViewContent: some View {
TabView {
ContentView()
.tabItem {
Image(systemName: "dot.radiowaves.left.and.right")
Text("Radio")
}
WinView()
.tabItem {
Image(systemName: "w.circle")
Text("Win")
}
SettingsView()
.tabItem {
Image(systemName: "gear")
Text("Settings")
}
}.accentColor(Color.red)
.onAppear(){
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
if monitor.score == 0{
self.errorDetail = true
} else {
self.errorDetail = false
}
//print("this is the score \(monitor.score)")
}
}
}
var body: some View {
if (self.lat == "0.0" && self.lon == "0.0"){
LocationDisabled()
}
else{
if #available(iOS 14.0, *) {
tabViewContent
.fullScreenCover(isPresented: self.$errorDetail, content: NetworkOutageView.init)
} else {
tabViewContent
.sheet(isPresented: self.$errorDetail, content: NetworkOutageView.init)
}
}
}
}