cic*_*o79 5 xcode mapkit directions
我需要绘制一个以坐标列表(P1,P2,... Pn)开头的路径.对于我的列表中的每个下一对Pi,Pj,我调用calculateDirectionsWithCompletionHandler类的方法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}
Run Code Online (Sandbox Code Playgroud)
并且没有任何作品了.
我认为这是因为我在很短的时间内调用了API太多次了.我在网上发现我应该使用该属性direction.calculating并检查请求是否已在进行中.我无法理解如何使用它.有人可以帮帮我吗?谢谢.
我在进行单元测试时也经历过同样的事情。
我通常对此类 API 执行的操作是使用速率限制器。它限制给定时间范围内对 API 的调用次数。
有几种实现,我成功使用并喜欢这个https://github.com/nuclearace/SwiftRateLimiter
它可以让您选择呼叫次数和时间范围。(您甚至可以为一个 API 使用两个实例,也就是说:每秒最多 10 次调用,每分钟最多 100 次调用)
我不太喜欢 Direction.isCalculate 方法,因为它使得在一般情况下同步线程变得困难。一个简单的方法是在拨打下一个电话之前等待答复。得到答案后,directions.isCalculating显然是假的。
但我更喜欢速率限制器。
苹果正在限制“编写不良/行为不当的应用程序”,但我不知道苹果是否记录了其用于这样做的速率限制。
代码示例:
let GlobalDirectionsRateLimiter = RateLimiter(tokensPerInterval: 3, interval: 1.0)
GlobalDirectionsRateLimiter.removeTokens(1) {_,_ in
directions.calculate { (response: MKDirections.Response?, error: Swift.Error?) in
...
}
}
Run Code Online (Sandbox Code Playgroud)
不要相信我的速率限制器参数。我的应用程序中的所有计算都来自用户操作,因此我不需要更多。
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |