我正在构建一个使用MapKit在地图上显示自定义行驶路线的应用程序。它需要一个坐标数组并经过一个for循环,在每个循环中,相应的坐标(即[0]和[1]或[7]和[8])被组合成一个单独的请求,然后在地图上绘制。
为了绕过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次(或数组的大小)
“ Timer fired”也被打印了18次
实际上,“开始在'timerDelay'秒开始的'dest'计时器”的打印次数正确,而“ Timer fired”的打印次数是应打印的两倍。
非常感谢您的帮助和耐心,对于编程我是一个陌生的人,正在努力解决这个问题。
答案 0 :(得分:0)
实际上,我不知道为什么为每个单独的请求打印两次“计时器已触发” :)。
但是但是,如果您使用Timer.scheduledTimer
只是为了延迟执行该块,则可以使用DispatchQueue.main.asyncAfter
代替Timer
DispatchQueue.main.asyncAfter(deadline: .now() + timerDelay) {
self.createIndividualDirectionsRequest(request)
print("Timer fired")
}
您也可以使用DispatchQueue.global.asyncAfter
,但我认为您想在主ui线程中执行该块