gpt4 book ai didi

Swift - 带条件的 GCD 定时器

转载 作者:行者123 更新时间:2023-11-28 10:35:08 27 4
gpt4 key购买 nike

我使用 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?

然后创建一个方法来启动定时器。 (one-shot) 计时器在未运行时创建,在运行时重新启动。在 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

关于Swift - 带条件的 GCD 定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53930498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com