Swift - Таймер с GCD с условием - PullRequest
       30

Swift - Таймер с GCD с условием

0 голосов
/ 26 декабря 2018

Я использую Firebase для загрузки файла с индикатором прогресса:

RappleActivityIndicatorView.setProgress(CGFloat(a), textValue: "\(String(a * 100)) %")
print("\(a) %")

Я хочу реализовать условие: если значение% (например, 23%) застряло на 15 секунд илиболее того, он запускает отмену загрузки.

Я думал о таймере GCD:

 DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
        print("We can launch the cancellation of the upload")
    }

Но я не знаю, как связать условие значения, которое не обновленов течение 15 секунд.Есть идеи?

Большое спасибо,

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Подходящим решением является таймер тайм-аута.Преимущество таймера 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
0 голосов
/ 26 декабря 2018

Попробуйте это:

var timer: Timer?

// every time you set new percent start new Timer. if in 15 sec it will not reach new percent -> cancellation begins
func startNewTimer() {
    timer?.invalidate()
    timer = Timer.scheduledTimer(withTimeInterval: 15, repeats: false, block: { (_) in
        // do cancellation
    })
}
...