计时器在“ for in”循环中初始化,每个循环触发两次

时间:2019-03-26 05:00:48

标签: swift loops timer

我正在构建一个使用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”的打印次数是应打印的两倍。

非常感谢您的帮助和耐心,对于编程我是一个陌生的人,正在努力解决这个问题。

1 个答案:

答案 0 :(得分:0)

实际上,我不知道为什么为每个单独的请求打印两次“计时器已触发” :)

但是但是,如果您使用Timer.scheduledTimer只是为了延迟执行该块,则可以使用DispatchQueue.main.asyncAfter代替Timer

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

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