Запрос 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 и посмотреть, есть ли в нем еще значения в этой точке.