一个合适的解决方案是超时计时器。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