[英]Swift - Timer with GCD with condition
我使用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秒内未更新的值的条件。 任何想法 ?
非常感谢,
合适的解决方案是超时计时器。 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
尝试这个:
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
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.