【发布时间】:2019-04-22 14:11:16
【问题描述】:
我在for 循环中使用MKDirections 类的calculate() 方法请求计算从我当前位置到数组countySites 中的露营地位置的距离。当我有一个长度为 47 个露营地的数组时,只计算了一些露营地距离,其余的会产生一条错误消息,提示正在发出太多请求。在for 循环中发出请求之前,我不知道如何检查calculate() 是否太忙。
我尝试在代码中放置一个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()
}
}
}
【问题讨论】:
-
我从
print(error.debugDescription)语句Optional(Error Domain=MKErrorDomain Code=3 "Directions Not Available" UserInfo={NSLocalizedFailureReason=Route information is not available at this moment., MKErrorGEOError=-3, MKErrorGEOErrorUserInfo={ }, MKDirectionsErrorCode=3, NSLocalizedDescription=Directions Not Available})得到错误信息 -
当我尝试
while循环解决方案时,isCalculating的值始终为 false,因此它永远不会执行while循环块内的代码。当error有非零值时,isCalculating只会在闭包中的else语句中出现true -
您可能正在搜索的是速率限制器。使用此关键字搜索您会找到的解决方案。
-
@Gerd Castan 谢谢,我会查一下。
-
@Gerd Castan 我尝试了速率限制器,但将速率设置为每秒 1 个令牌仍然无助于太多请求
标签: ios swift mapkit mkdirection