Задержка кода в функции, которая вызывается несколько раз в секунду - PullRequest
0 голосов
/ 29 августа 2018

Я создаю приложение, в котором я получаю значения датчика. Каждый раз, когда значение датчика изменяется, вызывается функция 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)
}

Я ожидал, что «что-то» будет напечатано только через одну секунду, но я считаю, что проблема в том, что doStuff () вызывается несколько раз в секунду. Можно ли каким-то образом выполнить код после определенной задержки в функции, которая вызывается несколько раз в секунду? И почему мой пример не работает?

Я думал о создании логической переменной в первом классе, которая устанавливается в значение true через 1 секунду, а затем вызывал функцию другого класса, но я думал, что это может загромождать мой код, потому что я уже сделал это где-то еще.

1 Ответ

0 голосов
/ 30 августа 2018

Для этого объявите глобальный таймер:

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)
    }
}
...