У меня есть этот класс, который управляет состоянием соединения моего приложения и работоспособностью на стороне сервера каждые 30 секунд.
class ConnectivityManager {
private var connectivityMonitor: NWPathMonitor?
private var serviceMonitor: DispatchSourceTimer?
var isNetworkAvailable: Bool = true
var isServiceAvailable: Bool = true
let connectivityMonitorQueue: DispatchQueue
let serviceMonitorQueue: DispatchQueue
init(){
// Checking the internet availability
self.connectivityMonitor = NWPathMonitor()
self.connectivityMonitorQueue = DispatchQueue(label: "my.connectivityMonitor", qos: .background)
self.serviceMonitorQueue = DispatchQueue(label: "my.serviceMonitor", qos: .background)
// Init the connectivity monitor
if let monitor = self.connectivityMonitor {
monitor.pathUpdateHandler = { path in
let netAva = (path.status == .satisfied)
if netAva != self.isNetworkAvailable {
self.isNetworkAvailable = netAva
self.isServiceAvailable = netAva
if !netAva {
// Stop services if no network available
self.serviceMonitor?.cancel()
// here show a message
} else {
// hide the message if the connection is back
// Restart services
self.serviceMonitor?.resume()
}
}
}
}
// Init the server side app status monitor
self.serviceMonitor = DispatchSource.makeTimerSource(queue: serviceMonitorQueue)
self.serviceMonitor!.schedule(deadline: .now(), repeating: .seconds(30))
self.serviceMonitor!.setEventHandler {
NetworkService.getServerHealth { (isServiceAvailable, error) in
if self.isServiceAvailable != isServiceAvailable {
self.isServiceAvailable = isServiceAvailable
if !isServiceAvailable {
// here show a message
} else {
// hide the message if the service is back
}
}
}
}
}
final func startMonitoring() {
self.connectivityMonitor?.start(queue: self.connectivityMonitorQueue)
self.serviceMonitor?.resume()
}
final func stopMonitoring() {
self.connectivityMonitor?.cancel()
self.serviceMonitor?.cancel()
}
}
Когда соединение не работает, я останавливаю self.serviceMonitor
с помощью self.serviceMonitor?.cancel()
, чтобы чтобы избежать проверки на стороне сервера без подключения. Когда соединение восстановится, я бы хотел перезапустить self.serviceMonitor?
, используя self.serviceMonitor?.resume()
, но я получаю ошибку
exc_bad_instruction (code=exc_i386_invop subcode=0x0)
!
Я полагаю, что есть ошибка с защитой потока, но добавление
DispatchQueue.main.async {
self.serviceMonitor?.resume()
}
не исправляет ошибку ...
Что я могу сделать для этого !? Заранее спасибо!