Получение 'exc_bad_instruction (code = exc_i386_invop subcode = 0x0)' с 'DispatchQueue.resume ()' - PullRequest
0 голосов
/ 01 марта 2020

У меня есть этот класс, который управляет состоянием соединения моего приложения и работоспособностью на стороне сервера каждые 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()
}

не исправляет ошибку ...

Что я могу сделать для этого !? Заранее спасибо!

...