Swift Direction请求不会在if语句中正确计算

问题描述:

我想计算用户当前位置到许多不同位置的距离,并将这些计算放入计算数组中。所以我可以对这个数组进行排序并找到最近的位置。最后,我想在用户体验上显示表视图顶部的最近位置。但我无法正确地将每个计算附加到“计算数组”中。请参阅我在代码末尾使用print()获得的输出。我在哪里做错了?感谢您的帮助。Swift Direction请求不会在if语句中正确计算

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) 

问题是directions.request是一个异步方法,因为它需要调用Apple的服务器来计算距离,并且在请求实际返回之前尝试使用它的值。另外请注意,大多数需要网络请求的MapKit调用都有一个速率限制,所以如果您连续做20个呼叫,您可能会受到速率限制(即使Apple没有发布确切的数字,所以您不需要知道这是什么时候发生的)。

在使用它们的值之前,您需要等待所有方向请求完成执行。如果数组是空的,则Array.min()返回nil,这就是这种情况,因此也是错误。

基于输出,我没有看到这行输出:

print("distance is \(distance)") 

这使我相信你的距离没有被追加到计算数组。

因此,在while循环结束时计算数组为空,当您尝试获取空数组的min()时,它将返回nil并强制解包,从而导致崩溃。

我会建议你在你将距离追加到计算数组的行上放置一个断点,看它是否正在执行。

如果是,则尝试在while循环结束时打印计算数组的值,并查看该点是否还有值。

+0

这不提供问题的答案。一旦你有足够的[声誉](https://*.com/help/whats-reputation),你将可以[对任何帖子发表评论](https://*.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/16902868) –