Запрос Swift Direction не вычисляется в операторе if правильно

Я хотел вычислить расстояния от текущего местоположения пользователя до множества разных мест и поместить эти вычисления в массив вычислений. Так что я могу отсортировать этот массив и найти ближайшее местоположение. В конце я хочу показать ближайшее расположение в верхней части табличного представления для удобства пользователей. Но я не могу добавить каждый расчет в "массив вычислений" правильно. Пожалуйста, посмотрите выходные данные, которые я получаю с print() в конце моих кодов. Где я делаю не так? Спасибо за вашу помощь.

   override func viewDidLoad() {
    super.viewDidLoad()
    visualEffect.isHidden = true

    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()

    Calculate()
}

var closestDistanceIndex:Int = 0

func Calculate()  {


// anlık lokasyona en yakın giriş hesaplaması

    var calculations:[Double] = []
    var distance:Double = 0.0
    var i = 1

    while i < (giselerGiris.count)
    {
        print("index \(i)")

        let locValue:CLLocationCoordinate2D = manager.location!.coordinate

        let source1 = MKMapItem( placemark: MKPlacemark(
            coordinate: CLLocationCoordinate2DMake(locValue.latitude, locValue.longitude),
            addressDictionary: nil))

        let destination1 = MKMapItem(placemark: MKPlacemark(
            coordinate: CLLocationCoordinate2DMake(girisLatitude[i], girisLongtitude[i]),
            addressDictionary: nil))

        let directionsRequest = MKDirectionsRequest()
        directionsRequest.source = source1
        directionsRequest.destination = destination1
        directionsRequest.transportType = .automobile


        let directions = MKDirections(request: directionsRequest)

        directions.calculate { (response, error) -> Void in
            print("hata \(String(describing: error))")
            distance = (response!.routes.first?.distance)!

            print("distance is \(distance)")
            calculations.append(distance)
        }

        print("distance \(i): \(distance)")
         i += 1
    }

    let closestDistance = calculations.min()!
    print("closest distance is \(closestDistance)")
    closestDistanceIndex = calculations.index(of: closestDistance)!   
    print("closest distance index is  \(closestDistanceIndex)")
}

Я получаю ошибку ниже

 fatal error: unexpectedly found nil while unwrapping an Optional value
 (lldb)

в этом ряду

  let closestDistance = calculations.min()!

и вот выходы

index 1
distance 1: 0.0
index 2
distance 2: 0.0
index 3
distance 3: 0.0
index 4
distance 4: 0.0
index 5
distance 5: 0.0
index 6
distance 6: 0.0
index 7
distance 7: 0.0
index 8
distance 8: 0.0
index 9
distance 9: 0.0
index 10
distance 10: 0.0
index 11
distance 11: 0.0
index 12
distance 12: 0.0
index 13
distance 13: 0.0
index 14
distance 14: 0.0
index 15
distance 15: 0.0
index 16
distance 16: 0.0
index 17
distance 17: 0.0
index 18
distance 18: 0.0
index 19
distance 19: 0.0
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) 

2 ответа

Решение

Проблема в том, что directions.request это асинхронный метод, так как ему нужно вызвать сервер Apple, чтобы вычислить расстояние, и вы пытаетесь использовать его значения, прежде чем запросы действительно смогут вернуться. Также имейте в виду, что существует ограничение скорости на большинстве MapKit звонки, которые требуют сетевого запроса, поэтому, если вы делаете 20 звонков подряд, вы можете получить ограниченную скорость (даже если Apple не публикует свои точные номера, поэтому вы не знаете, когда именно это произойдет).

Вам нужно подождать, пока все ваши запросы направления завершат выполнение, прежде чем использовать их значения. Array.min() возвращается nil если массив пуст, что имеет место здесь и, следовательно, ошибка.

Основываясь на выводе, я не вижу эту строку:

print("distance is \(distance)")

Это приводит меня к мысли, что ваши расстояния не добавляются в массив вычислений.

Поэтому из-за этого массив вычислений пуст в конце цикла while, и когда вы попытаетесь получить min() для пустого массива, он вернет nil и принудительно развернет, что вызовет сбой.

Я бы порекомендовал вам поставить точку останова на линии, где вы добавляете расстояние к массиву вычислений, и посмотреть, выполняется ли он.

Если это так, попробуйте распечатать значения массива вычислений в конце цикла while и посмотреть, есть ли в нем еще значения в этой точке.

Другие вопросы по тегам