Timer.scheduledTimer не стреляет - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь рассчитать время, которое требуется транспортному средству, чтобы пройти между двумя контрольными точками.Для этого я настроил следующий таймер.

func startTimer() {
    if hasStarted == true && timerStarted == false {
        print("Timing started!")
        gameTimer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: (#selector(activeTiming)), userInfo: nil, repeats: true)
        timerStarted = true
    }
}

@objc func activeTiming() {
    print("Active timing block")
    if(hasFinished == false) {
        gameTime = gameTime + 0.001
        print("Add time succeeded")
    } else {
        gameTimer?.invalidate()
    }
}

Ожидаемый результат будет следующим:

Timing started!
Active timing block
Add time succeeded
Add time succeeded ... etc

Фактический результат:

Timing started!

Итакможет показаться, что startTimer вызывается правильно, но таймер не запускает блок кода activeTiming.Любые предложения будут чрезвычайно полезны.Заранее благодарю за помощь.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Ваш код работает для меня, но это не то, как вы хотите рассчитать событие, потому что Timer не настолько точен, и вы тратите много вычислительного времени (читай батарею).

Вместо этого я предлагаю следующий подход:

Когда событие начинается, запишите время начала:

let startTime = Date()

Когда событие закончится, вычислите истекшее время:

let elapsedTime = Date().timeIntervalSince(startTime)

elapsedTime будет в секундах (включая доли секунды).

0 голосов
/ 13 июня 2018

Публикация этого кода в том виде, в котором он используется, но я не специалист по Swift, поэтому ваш пробег может отличаться!

class PerformanceTest {
    var name:           String = ""
    var tolerance:      Int64 = 0
    var lastTime:       Int64 = 0
    var thisTime:       Int64 = 0
    var delta:          Int64 = 0
    var percent:        Float = 0

    func setTolerance(vName: String, vTolerance: Int64) {
        name = vName
        tolerance = vTolerance
    }

    func reset() {
        delta = 0
        percent = Float((Float(delta) / Float(tolerance))) * 100
        //high = 0
    }

    func start() {
        lastTime = Date().toMillis()
    }

    func finish() {
        thisTime = Date().toMillis()
        let vDelta = thisTime - lastTime
        if(vDelta > delta) {
            delta = vDelta
            percent = Float((Float(delta) / Float(tolerance))) * 100
            if(delta > tolerance) {
                print("Performance Indicator: \(name) Above Tolerance" + String(format: "%3.0f", percent) + "%")
            }
        }
    }

    func display() -> String {
        //high = delta
        //print("\(vString) Tolerance: \(tolerance) Max: \(high)")
        return String(format: "%3.0f", percent) + "%  |"
    }
   }

extension Date {
    func toMillis() -> Int64! {
        return Int64(self.timeIntervalSince1970 * 1000)
    }

Использование:

var performanceDefenseLoop = PerformanceTest()
performanceDefenseLoop.setTolerance(vName:  "DefenseLoop", vTolerance: 150)

func timeToUpdateDefenses()
{
    performanceDefenseLoop.start()
    defesensesLoop()
    performanceDefenseLoop.finish()
    print("\(performanceDefenseLoop.Display())"
}

// Для сброса performanceDefenseLoop.reset ()

Обязательно запустите таймеры в главном потоке!

...