我正在构建一个要获取传感器值的应用程序。每次传感器值更改时,都会每秒调用多次handleDeviceMotionUpdate函数。
handleDeviceMotionUpdate调用以下不同类的函数:
func doStuff(){
delay(1){
print("some thing")
}
}
延迟函数如下所示,我在Stackoverflow上的某处找到了
func delay(_ delay:Double, closure:@escaping ()->()){
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
我希望“某物”仅在经过一秒钟后才打印,但是我相信问题是每秒doDouff()被调用多次。在每秒被多次调用的函数中经过一定的延迟后,是否可以通过某种方式执行代码?为什么我的示例不起作用?
我考虑过在第一个类中创建一个布尔变量,该变量在1秒后设置为true,然后调用不同类的函数,但是我认为这可能会使我的代码混乱,因为我已经在其他地方完成了此操作。
答案 0 :(得分:1)
为此,声明一个全局计时器:
var timer: Timer = Timer(timeInterval: -1, target: self, selector: #selector(ViewControllerName.doStuff), userInfo: nil, repeats: false)
ViewControllerName
是使用doStuff()
作为方法的类的名称。
请确保首先使计时器无效(例如在viewDidLoad()
中):
timer.invalidate()
这是您的doStuff()
的样子:
func doStuff() {
//As long as the timer is started/vlaid, nothing will be executed
if !timer.isValid {
//print something or do whatever you'd like
print("some thing ", Date())
//and finally restart the timer
timer = Timer.scheduledTimer(
timeInterval: 1, //This is the time interval you don't want to do nothing
target: self,
selector: #selector(ViewController.doStuff),
userInfo: nil,
repeats: false)
}
}