Есть ли способ запустить SimplePing асинхронно на Swift? - PullRequest
0 голосов
/ 26 февраля 2020

Я взял в свои руки создание приложения, которое пингует локальные IP-адреса и сохраняет ли доступный IP-адрес в таблице. Проблема в том, что мне нужно выполнить эту задачу asyn c, и количество потоков должно быть легко редактируемым из кода. Например: если максимальное количество потоков равно 10, тогда 10 функций "ping ()" запускаются одновременно с разными IP-адресами из массива. PlainPing похоже на путь к go, но я не могу запустить пингеры asyn c, они, похоже, застряли при запуске таким образом. Есть предложения?

Вот код: (это пример проверки только 10 IP-адресов.)

var queue = OperationQueue()

@IBAction func startPing(_ sender: UIBarButtonItem) {
        queue = OperationQueue()
        queue.maxConcurrentOperationCount = 10
        pings.removeAll()
        for i in 1...244 {
            let newIp = Ip(ip: "192.168.1.\(i)")
            pings.append(newIp)
        }
        for i in 1...10 {
            let operation = BlockOperation {
                self.ping(index: i)
            }
            queue.addOperation(operation)
        }
        pingButton.isEnabled = false
}

func ping(index: Int) {
        let ping = pings[index-1]
        print(ping.ip) //THIS WORKS and after that PlainPing isn't.
        PlainPing.ping(ping.ip, withTimeout: 3, completionBlock: { (timeElapsed:Double?, error:Error?) in
            if let latency = timeElapsed {
                print("\(ping) latency (ms): \(latency)")
            }
            if let error = error {
                print("error: \(error.localizedDescription)")
            }
        })
}

Я читал, что SimplePing не работает с GD C. Какие бы тогда были другие решения?

1 Ответ

0 голосов
/ 26 февраля 2020

Хорошо, я фактически не смог найти одновременно работающую библиотеку Pinger, поэтому я сделал это, используя Alamofire :

AF.request("http://\(ping.ip)").responseJSON { (response) in
            if (response.response) != nil {
                print("success")
                let result = Ip(ip: "\(ping.ip) REACHABLE")
                ips.append(result)
                self.tableView.reloadData()
            } else {
                print("error")
                let result = Ip(ip: "\(ping.ip) UNREACHABLE")
                ips.append(result)
                self.tableView.reloadData()
            }
}

, что на самом деле работает для меня. Если локальный IP-адрес, который я предоставляю, недоступен, ответ остается пустым.

...