xcode - MKDirections 许多请求停止工作

标签 xcode mapkit directions

我需要从坐标列表(P1,P2,... Pn)开始绘制一条路径。对于列表中的每一对 Pi,Pj,我调用方法 calculateDirectionsWithCompletionHandler类(class) MKDirections直到 Pn-1 元素。我第一次称它为一切看起来都很完美。
但是,如果我第二次或更多次打电话,我会收到此错误:

Error Domain=MKErrorDomain Code=3 "Directions Not Available" UserInfo={NSLocalizedFailureReason=Route information is not available at this moment., MKErrorGEOError=-4, MKDirectionsErrorCode=2, NSLocalizedDescription=Directions Not Available}

没有任何效果了。

我认为这是因为我在短时间内调用 API 的次数过多。我在网上发现我应该使用属性 direction.calculating并检查请求是否已经在进行中。我无法理解如何使用它。任何人都可以帮助我吗?谢谢你。

最佳答案

我在进行单元测试时也遇到了同样的情况。

我通常对此类 API 所做的是使用速率限制器。它限制了在给定时间范围内对 API 的调用次数。

有几种实现,我成功使用并喜欢这个https://github.com/nuclearace/SwiftRateLimiter

它使您可以选择调用次数和时间范围。 (你甚至可以为一个 API 使用两个实例,比如说:每秒最多 10 次调用,每分钟最多 100 次调用)

我不太喜欢direction.isCalculating 方法,因为它使得在一般情况下很难同步你的线程。
一个简单的方法是在调用下一个电话之前等待应答。
得到答案后,directions.isCalculating显然是假的。

但我更喜欢限速器。

苹果正在限制“写得不好/行为不端的应用程序”,但我不知道苹果记录了它用来这样做的速率限制。

代码示例:

let GlobalDirectionsRateLimiter = RateLimiter(tokensPerInterval: 3, interval: 1.0)


GlobalDirectionsRateLimiter.removeTokens(1) {_,_ in
    directions.calculate { (response: MKDirections.Response?, error: Swift.Error?) in
    ...
    }
}

不要相信我的限速器参数。我的应用程序中的所有计算都来自用户操作,所以我不需要更多。

关于xcode - MKDirections 许多请求停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34400515/

相关文章:

ios - 更新到 Xcode 11 GM Seed 后无法在 Assets 目录中添加图像

ios - Swift 不允许我有 2 个同名选择器

swift - 从两个给定点创建一条线

javascript - Google map - 路线服务 api ZERO_RESULTS

android - 在android中查找从源到目的地的路线指示

xcode - Swift 博客或播客

iphone - 无法使用 Xcode 4 在 Subversion 上提交

ios - 点击 userLocation 的标题

swift - MapKit 从坐标绘制折线 Swift 5

苹果手机 : google maps directions