gpt4 book ai didi

swift - 无法等待 MKDirections.calculate 的结果,取而代之的是 nil

转载 作者:行者123 更新时间:2023-11-28 07:41:45 30 4
gpt4 key购买 nike

我想使用 MKDirections.calculate 计算我当前位置和 CLLocation 列表之间的实际步行距离。但是,出于某种原因,函数末尾的返回命令不会等待结果并尝试返回空变量。我的代码如下所示:

func getDistance (location1: CLLocation, location2: CLLocation) {
let coordinates1 = location1.coordinate
let placemark1 = MKPlacemark(coordinate: coordinates1)
let sourceItem = MKMapItem(placemark: placemark1)
let coordinates2 = location2.coordinate
let placemark2 = MKPlacemark(coordinate: coordinates2)
let destinationItem = MKMapItem(placemark: placemark2)

let request = MKDirectionsRequest()
request.source = sourceItem
request.destination = destinationItem
request.requestsAlternateRoutes = true
request.transportType = .walking

var distance: Double?

let directions = MKDirections(request: request)
directions.calculate { (response, error) in

if var routeResponse = response?.routes {
routeResponse.sort(by: {$0.expectedTravelTime < $1.expectedTravelTime})
let quickestRoute: MKRoute = routeResponse[0]
distance = Double(quickestRoute.distance)
}
}

return distance //returns nil
}

然后我想在这样的代码中使用该函数:

let myLocation = CLLocation(latitude: 47.0, longitude: 17.0)
let destinationArray = [CLLocation(latitude: 47.1, longitude: 17.1), CLLocation(latitude: 47.2, longitude: 17.2), CLLocation(latitude: 47.3, longitude: 17.3)]
var distanceArray: [Double] = []
for destination in destinationArray {
distanceArray.append(getDistance(location1: myLocation, location2: destination))
}
return distanceArray

我试过闭包,但它们没有用,因为我找不到返回 distanceArray 的方法(同样的错误,它没有等待闭包运行并返回空数组)。我也尝试过 DispatchGroups 但它们没有效果(也许我以错误的方式实现了它们)。

非常感谢您的帮助。

谢谢。

最佳答案

Using MapKit & Swift 5

计算两个位置位置之间的距离,这对任何人都有帮助

示例功能:我已经在 Google Map 和 Apple Map 中进行了测试

        let startLocation : CLLocation = CLLocation.init(latitude: 23.0952779, longitude: 72.5274129)
let endLocation : CLLocation = CLLocation.init(latitude: 23.0981711, longitude: 72.5294229)
let distance = startLocation.distance(from: endLocation)
self.getDistance(departureDate: Date().adjust(hour: 8, minute: 0, second: 0, day: 0, month: 0), arrivalDate: Date().adjust(hour: 8, minute: 10, second: 0, day: 0, month: 0), startLocation: startLocation, endLocation: endLocation) { (distanceInMeters) in

print("fake distance: \(distance)")
let fakedistanceInMeter = Measurement(value: distance, unit: UnitLength.meters)
let fakedistanceInKM = fakedistanceInMeter.converted(to: UnitLength.kilometers).value
let fakedistanceInMiles = fakedistanceInMeter.converted(to: UnitLength.miles).value
print("fakedistanceInKM :\(fakedistanceInKM)")
print("fakedistanceInMiles :\(fakedistanceInMiles)")


print("actualDistance : \(distanceInMeters)")

let distanceInMeter = Measurement(value: distanceInMeters, unit: UnitLength.meters)
let distanceInKM = distanceInMeter.converted(to: UnitLength.kilometers).value
let distanceInMiles = distanceInMeter.converted(to: UnitLength.miles).value
print("distanceInKM :\(distanceInKM)")
print("distanceInMiles :\(distanceInMiles)")
}

函数的使用

                    self.getDistance(departureDate: trip.departure.dateTime, arrivalDate: trip.arrival.dateTime, startLocation: startLocation, endLocation: endLocation) { (actualDistance) in
print("actualDistance : \(actualDistance)")
}

我改进了上面的功能,在这里添加了代码,希望对大家有所帮助。

func calculateDistancefrom(departureDate: Date, arrivalDate: Date, sourceLocation: MKMapItem, destinationLocation: MKMapItem, doneSearching: @escaping (_ distance: CLLocationDistance) -> Void) {

let request: MKDirections.Request = MKDirections.Request()

request.departureDate = departureDate
request.arrivalDate = arrivalDate

request.source = sourceLocation
request.destination = destinationLocation

request.requestsAlternateRoutes = true
request.transportType = .automobile

let directions = MKDirections(request: request)
directions.calculate { (directions, error) in
if var routeResponse = directions?.routes {
routeResponse.sort(by: {$0.expectedTravelTime <
$1.expectedTravelTime})
let quickestRouteForSegment: MKRoute = routeResponse[0]

doneSearching(quickestRouteForSegment.distance)
}
}
}

func getDistance(departureDate: Date, arrivalDate: Date, startLocation : CLLocation, endLocation : CLLocation, completionHandler: @escaping (_ distance: CLLocationDistance) -> Void) {

let destinationItem = MKMapItem(placemark: MKPlacemark(coordinate: startLocation.coordinate))
let sourceItem = MKMapItem(placemark: MKPlacemark(coordinate: endLocation.coordinate))
self.calculateDistancefrom(departureDate: departureDate, arrivalDate: arrivalDate, sourceLocation: sourceItem, destinationLocation: destinationItem, doneSearching: { distance in
completionHandler(distance)
})
}

关于swift - 无法等待 MKDirections.calculate 的结果,取而代之的是 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52059914/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com