ios - 如何阻止“MKDirections”类的“计算”方法发出过多的距离计算请求?
问题描述
我正在countySites
使用循环中类的calculate()
方法请求计算从当前位置到数组中的露营地位置的距离。当我有一个长度为 47 个露营地的数组时,只计算了一些露营地距离,其余的会产生一条错误消息,提示正在发出太多请求。在我在循环中发出请求之前,我不知道如何检查是否太忙。MKDirections
for
calculate()
for
我尝试while
在代码中放置一个循环来重复检查仍在使用该isCalculating
Bool
属性处理的计算,但它无法停止错误消息。
countySites = england.counties[selectedCounty!]!
let sourcePlacemark = MKPlacemark(coordinate: currentCoordinate!)
let request = MKDirections.Request()
request.source = MKMapItem(placemark: sourcePlacemark)
request.transportType = .automobile
request.requestsAlternateRoutes = false
let group = DispatchGroup()
activityIndicator.startAnimating()
// Step through sites one by one
for siteIndex in 0..<countySites.count {
var selectedSite = countySites[siteIndex]
let destinationPlacemark = MKPlacemark(coordinate: selectedSite.locationCoordinate)
request.destination = MKMapItem(placemark: destinationPlacemark)
let distanceAndDirections = MKDirections(request: request)
if currentCoordinate != nil {
group.enter()
distanceAndDirections.calculate { (response, error) in
if error == nil {
let distanceInMetres = response?.routes.first?.distance
let distanceInMiles = distanceInMetres! / 1610
let roundedDistanceInMiles = Int(distanceInMiles.rounded())
let distanceToSite = roundedDistanceInMiles
selectedSite.distance = distanceToSite
self.countySites[siteIndex] = selectedSite
} else {
print(error.debugDescription)
}
group.leave()
}
}
}
group.notify(queue: .main) {
self.countySites = self.sortByDistance(sites: self.countySites)
self.tableView.reloadData()
self.activityIndicator.stopAnimating()
}
}
}
解决方案
这个问题的唯一解决方案是只保留一个 MKRoute 数组,每当您遇到新路径时,只需保存到该数组并使用相同的数组来绘制路径,使用此方法您也可以保存 mapKit 距离调用
检查以下对我有用的片段
var distanceArray: [MKRoute]? // like this create an array inside the class
func drawPath(destination: CLLocationCoordinate2D, source: CLLocationCoordinate2D) {
let sourcePlacemark = MKPlacemark(coordinate: source, addressDictionary: nil)
let destinationPlacemark = MKPlacemark(coordinate: destination, addressDictionary: nil)
let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
let destinationMapItem = MKMapItem(placemark: destinationPlacemark)
let directionRequest = MKDirectionsRequest()
directionRequest.source = sourceMapItem
directionRequest.destination = destinationMapItem
directionRequest.transportType = .walking
let directions = MKDirections(request: directionRequest)
if distanceArray.count > 0 {
guard let route = distanceArray.first?.routes else {return}
self.showPath(route: route)
} else {
directions.calculate { (response, error) -> Void in
guard let response = response else {
if let error = error {
print("Error YuluMapView: \(error)")
}
return
}
guard let route = response.routes.first else {return}
distanceArray.append(route)
self.showPath(route: route)
}
}
}
func showPath(route: MKRoute) {
self.add((route.polyline), level: MKOverlayLevel.aboveRoads)
let rect = route.polyline.boundingMapRect
self.setVisibleMapRect(rect, edgePadding: defaultEdgeInsets, animated: true)
}
它对我 100% 有效,希望您可以使用此逻辑来避免此问题。
推荐阅读
- python - 谷歌语音到文本不适用于小音频
- matlab - 自动设置参考颜色的问题
- laravel - Laravel 资源输出
- javascript - 使用双缓冲在画布上绘制图像时,无法获得完整的图像?
- apache-nifi - nifi从json文件中获取属性
- java - Java 抛出带参数的异常(异常 e,字符串 ... errs)
- reactjs - Flow + React 在利用无状态组件时中断
- azure-devops - 如何将仪表板、工作项、CI/CD 管道、测试计划和迭代从一个团队项目移动到另一个团队项目
- opencart-3 - Opencart 3 限制类别路径
- swift - Firebase 电子邮件/密码身份验证 + 验证异常