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
}
}
这可能是一个语义问题,但我发誓我已经在这上面花了几天时间,但我觉得我一无所获。
目前的问题
- 它在 20 和 -20 之间触发,但它立即触发并且不会等待 5 秒
- 它触发了很多次,这意味着下一个控制器的 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
条件
周围不需要括号
我正在尝试从 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
}
}
这可能是一个语义问题,但我发誓我已经在这上面花了几天时间,但我觉得我一无所获。
目前的问题
- 它在 20 和 -20 之间触发,但它立即触发并且不会等待 5 秒
- 它触发了很多次,这意味着下一个控制器的 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
条件