Где не должно быть ни одного случая, когда UDPServer не вернется. Должен быть предел времени ожидания для того, как долго UDPServer должен ждать. Например, рассмотрим следующий случай:
DispatchQueue.global(qos: .background).async {
let server = UDPServer(address:"0.0.0.0", port:5005)
switch server.recv(1024) {
case .success:
print("Server received message from client.")
case .failure(let error):
print("Server failed to received message from client: \(error)")
}
server.close()
DispatchQueue.main.async {
...
}
}
Добавить таймер, который срабатывает после определенного интервала времени ожидания
Объявить константу для интервала времени ожидания и свойство для таймера
private let timeoutSeconds = 30
private var timer : DispatchSourceTimer?
и написать две функции для запуска и остановки таймер.
fileprivate func startDispatchTimer()
{
let interval : DispatchTime = .now() + .seconds(timeoutSeconds)
if timer == nil {
timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
timer!.schedule(deadline:interval)
timer!.setEventHandler {
// do something when the timer fires
self.timer = nil
}
timer!.resume()
}
}
fileprivate func stopDispatchTimer()
{
timer?.cancel()
timer = nil
}
Запустите таймер после инициализации экземпляра сервера и остановите его в случае успеха. В случае неудачи добавьте код в закрытие setEventHandler
для обработки тайм-аута, например, для освобождения экземпляра сервера.