Swift 5 计时器倒计时,同时一个值在一个范围内

Swift 5 timer countdown, while a value is in a range

我正在尝试从 5 到 0 倒计时,而用户方位距真北的弧度在 20 到 -20 之间。如果轴承在 20 和 -20 之间保持 5 秒,请转到新控制器。我什么都试过了,几乎都放弃了。

我尝试了很多东西,包括 scheduleTimer(withInterval 1.0){}

我是 Swift 的新手。我无法使计时器无效。

这是获取用户标题

@objc func getUserHeading(_ latitude : Double, _ longitude : Double, _ userLocation : CLLocation){
    let lat1 = (latitude) * .pi / 180
    let long1 = (longitude) * .pi / 180
    
    let lat2 = (yourLocation.coordinate.latitude) * .pi / 180
    let long2 = (yourLocation.coordinate.longitude) * .pi / 180
    print(lat1, long1, lat2, long2)
    
    let dLon = long2 - long1
    
    let y = sin(dLon) * cos(lat2)
    let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon)
    
    var radiansBearing = atan2(y, x)
    if radiansBearing < 0 {
        radiansBearing += 2 * Double.pi
    }
    theta = (radiansBearing * 180 / .pi) - (angle)
    print(theta)
    if (theta < 20 && theta > = -20 ){ 
        timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in 
        print("Timer Fired")
        runCount += 1
        if(theta > 20 && theta < -20)
        {
           self.timer.invalidate()
           self.timerStarted = false
        }
        if (runCount == 5)
        {
           self.timer.invalidate()
           self.segueToNewController()
        }
        
    }
    else{
        timer.invalidate()
        timerStarted = false
    }        
}

这可能是一个语义问题,但我发誓我已经在这上面花了几天时间,但我觉得我一无所获。

目前的问题

  1. 它在 20 和 -20 之间触发,但它立即触发并且不会等待 5 秒
  2. 它触发了很多次,这意味着下一个控制器的 segue 被调用了很多次(它导致像 5k 写入我的 firestore)

如果你们还需要什么,请告诉我,我会用更多代码更新问题。 所有帮助表示赞赏!我的智慧到此结束

您的代码存在一些问题

  • 您有 2 个相互矛盾的 if 子句,首先检查 theta 是否在区间内,然后在 if 子句内检查相同的值是否在区间外永远不会发生。
  • 最后一个 else 看起来放错地方了
  • 有些变量您更改但从未阅读

我会像这样重写它(从第一个 if 开始)

if theta < 20 && theta >= -20 {
    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
        print("Timer Fired")
        runCount += 1

        if runCount == 5 {
            timer.invalidate()        
        }
        //theta = ... here you need to somehow update this property to see if it has changed
        if theta > 20 && theta < -20 {
            timer.invalidate()                
        }

    }
} else {
    timer?.invalidate()
}

请注意,我删除了 timerStarted 变量,因为我没有看到拥有它的意义,也不是因为 if 条件

周围不需要括号