延迟每秒调用多次的函数中的代码

时间:2018-08-29 18:14:55

标签: swift delay

我正在构建一个要获取传感器值的应用程序。每次传感器值更改时,都会每秒调用多次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,然后调用不同类的函数,但是我认为这可能会使我的代码混乱,因为我已经在其他地方完成了此操作。

1 个答案:

答案 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)
    }
}