Подходящим решением является таймер тайм-аута.Преимущество таймера GCD заключается в том, что его можно перезапустить во время работы.
Вам нужно одно свойство, ссылка на таймер
var timeoutTimer : DispatchSourceTimer?
Затем создайте метод для запуска таймера.(Однократный) таймер создается, если он не работает, и перезапускается, если он работает.В обработчике событий, который выполняется через 15 секунд, строка печатается и таймер освобождается.
func startTimeoutTimer()
{
let delay : DispatchTime = .now() + .seconds(15)
if timeoutTimer == nil {
timeoutTimer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
timeoutTimer!.schedule(deadline: delay, repeating: 0)
timeoutTimer!.setEventHandler {
self.timeoutTimer!.cancel()
self.timeoutTimer = nil
print("We can launch the cancellation of the upload")
}
timeoutTimer!.resume()
} else {
timeoutTimer?.schedule(deadline: delay, repeating: 0)
}
}
Для управления таймером вам нужно другое свойство для текущего значения процента
var currentValue : CGFloat = 0.0
Когда процесс установлен, сравните значение с текущим значением и (повторно) запустите таймер, если значения отличаются.Если значения равны, таймер срабатывает по истечении 15 секунд.Если прогресс продолжается, например, через 8 секунд, таймер снова запускается с нуля.
RappleActivityIndicatorView.setProgress(CGFloat(a), textValue: "\(String(a * 100)) %")
if a != currentValue {
startTimeoutTimer()
currentValue = a
}
А после успешного завершения загрузки удалите таймер
self.timeoutTimer!.cancel()
self.timeoutTimer = nil