Таймер, инициализированный в цикле for in, запускается дважды для каждого цикла - PullRequest
0 голосов
/ 26 марта 2019

Я создаю приложение, которое отображает маршрут проезда на карте с помощью MapKit.Он принимает массив координат и проходит цикл for, в каждом цикле соответствующие координаты (т. Е. [0] и [1] или [7] и [8]) объединяются в отдельный запрос и затем выводятся на карту.

Чтобы обойти ошибку регулирования MapKit, у меня есть таймер, который установлен так, чтобы каждый запрос был разнесен на 1 секунду.

Моя проблема в том, что таймер срабатывает дважды для каждого отдельногоrequest, что приводит к удвоению количества необходимых запросов.

Я использую 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

        }
    }
}

Я ожидаю, что таймер сработает один раз для каждого цикла, если это произойдет, ожидаемый вывод консоли будет

"Запуск таймера для 'dest' в 'timerDelay' секунд" напечатан 18 раз (или любой другойразмер массива равен)

"Таймер сработал" печатается также 18 раз

В то время как "Запуск таймера для 'dest' в 'timerDelay' секунд" на самом делеВ правильном количестве раз «Таймер срабатывает» печатается вдвое чаще, чем следует.

Большое спасибо за вашу помощь и ваше терпение, я новичок в программировании и изо всех сил пытаюсь обернуть моеОбойдите эту проблему.

1 Ответ

0 голосов
/ 26 марта 2019

На самом деле я не знаю, почему «Таймер срабатывает» печатается дважды для каждого отдельного запроса :) .

Но если вы используете Timer.scheduledTimer просто для того, чтобы отложить выполнение блока, вы можете использовать DispatchQueue.main.asyncAfter вместо таймера

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

Вы также можете использовать DispatchQueue.global.asyncAfter, но я думаю, что вы хотите выполнить блок в основном потоке пользовательского интерфейса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...