gpt4 book ai didi

swift - 计时器在 'for in' 循环中初始化,每个循环触发两次

转载 作者:行者123 更新时间:2023-11-30 10:48:06 25 4
gpt4 key购买 nike

我正在构建一个使用 MapKit 在 map 上显示自定义驾驶路线的应用程序。它采用坐标数组并执行 for 循环,在每个循环中,相应的坐标(即 [0] 和 [1] 或 [7] 和 [8])被组装成单独的请求,然后绘制在 map 上。

为了绕过 MapKit 的限制错误,我设置了一个计时器,以便每个请求间隔 1 秒。

我的问题是,计时器针对每个单独的请求触发两次,这导致发出的必要请求数量增加了一倍。

我使用的是 Xcode 10 和 Swift 4,我认为这是发生问题的函数。

func requestDirections(arrays coordinates: [CLLocationCoordinate2D]) {

var dest = 1
let coordinatesArray = coordinates
let end = coordinatesArray.count - 2
var timerDelay:Double = 1

for origin in 0...end {

if dest <= coordinatesArray.count {

let startCoord = MKPlacemark(coordinate: coordinatesArray[origin])
let destCoord = MKPlacemark(coordinate: coordinatesArray[dest])

let request = MKDirections.Request()
request.source = MKMapItem(placemark: startCoord)
request.destination = MKMapItem(placemark: destCoord)
request.transportType = .automobile
request.requestsAlternateRoutes = false

print("Starting timer for \(dest) at \(timerDelay) seconds")

Timer.scheduledTimer(withTimeInterval: timerDelay, repeats: false) { timer in
self.createIndividualDirectionsRequest(request)
print("Timer fired")
}

dest = dest + 1
timerDelay = timerDelay + 1

}
}
}

我希望计时器为每个循环触发一次,如果发生这种情况,预期的控制台输出将是

“在 'timerDelay' 秒处为 'dest' 启动计时器”打印 18 次(或无论数组的大小)

“Timerfired”也被打印了 18 次

虽然“在 'timerDelay' 秒处为 'dest' 启动计时器”实际上被打印了正确的次数,但“计时器已触发”的打印次数是应有的两倍。

非常感谢您的帮助和耐心,我对编程还很陌生,并且正在努力解决这个问题。

最佳答案

实际上我不知道为什么每个单独的请求都会打印两次“Timerfired”:)

但是如果您使用 Timer.scheduledTimer 只是为了延迟 block 的执行,则可以使用 DispatchQueue.main.asyncAfter 代替定时器

DispatchQueue.main.asyncAfter(deadline: .now() + timerDelay) {
self.createIndividualDirectionsRequest(request)
print("Timer fired")
}

您还可以使用 DispatchQueue.global.asyncAfter 但我认为您想在主 ui 线程中执行该 block

关于swift - 计时器在 'for in' 循环中初始化,每个循环触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55350130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com