【问题标题】:Swift 5 timer countdown, while a value is in a rangeSwift 5计时器倒计时,而一个值在一个范围内
【发布时间】:2020-07-04 15:25:01
【问题描述】:

我正在尝试从 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
    }        
}

这可能是语义上的问题,但我发誓我已经为此花费了 DAYS 天,但我觉得我无处可去。

目前的问题

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

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

【问题讨论】:

    标签: swift timer uiviewcontroller


    【解决方案1】:

    您的代码存在一些问题

    • 您有 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 条件周围不需要括号

    【讨论】:

    • 您好,感谢您的评论!所以timerStarted 变量是因为计时器被多次触发,因为 startUpdatingUserHeading() 委托不断触发第一个 if 条件。我有第二个 if 条件因为标题变化太快以至于它(似乎)进入第一个 if 不管?
    • 否则如果theta的值超出范围?不?天哪,我觉得解决方案很简单,但我想念它
    猜你喜欢
    • 2023-04-02
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多