swift - CLGeocoder geocodeAddressString() 达到极限

标签 swift macos asynchronous swift3 clgeocoder

我正在使用 MapKit 的 CLGeocoder().geocodeAddressString() 来获取地址列表的坐标和县信息。只要请求数低于 50,一切都很好。但超过 50,我就达到了 API 的限制。由于 CLGeocoder 调用是异步的,因此我无法轻易地限制/控制调用流(例如,一次调用一个地址)。我将如何在“异步世界”中正确地做到这一点? (免责声明:我是 GCD 和异步流控制领域的新手,所以我想我可能需要更详细的回复)

相关代码如下:

在属性的地址上调用 CLGeocoder 的类属性的方法:

   func initializeCoordinates() {

        let addressForCoords = self.address.getAddress()
        CLGeocoder().geocodeAddressString(addressForCoords, completionHandler: { (placemarks, error) -> Void in
            if error != nil {
                print(error!)
                return
            }
            if placemarks!.count > 0 {
                let placemark = placemarks?[0]
                let location = placemark?.location
                self.coordinates = location?.coordinate

                if let subAdminArea = placemark?.subAdministrativeArea {
                    self.address.county = subAdminArea
                }
            }
        })
    }

然后在 ImportVC 中从文本框导入所有属性地址的部分(并对每个属性调用 initializeCoordinates 方法:

    for line in importText {
        let newAddress = Address()
        let newHouse = Property()

        // parse the tab delimited address for each line of input
        let address = line.components(separatedBy: "\t")
        if address.count == 4 {
            newAddress.street = address[0]
            newAddress.city = address[1]
            newAddress.state = trimState(state: address[2])
            newAddress.zip = address[3]
            newHouse.address = newAddress
            newHouse.initializeCoordinates()
            houses.append(newHouse)
        }
    }

最佳答案

我最近遇到了类似的问题。用最后调用自身的递归函数替换您的 for 循环。然而,诀窍是在 0.2 秒延迟后调用其自身。为了安全起见,我使用 0.4。这将增加用户的等待时间,尽管由于 API 限制我们别无选择。

关于swift - CLGeocoder geocodeAddressString() 达到极限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42229562/

相关文章:

ios - 将日期转换为 GMT 时间 Day Date Month Year Swift

ios - 过滤 NSFetchedResultsController 结果 swift 2

bash - 使用 FFmpeg 有条件地旋转风景的纵向视频

c++ - 非阻塞套接字的 Windows select 和 Unix select 之间的区别

python - 在 Mac OS 10.14 上安装 thrift_sasl

javascript - 使用 D3.js 创建数据的同步加载并在加载后绘制

c - 使用 C 的套接字和线程

swift - NSData contentsOfURL 返回 nil,即使 url 是有效的 swift 2.0

multithreading - 在 Windows 上等待 Network.Socket.accept 的 Haskell 或 Haskell OS 线程能否被杀死?

ios - 无法将 UITableViewCell 类型的值转换为 "ActuTblCell"