【发布时间】:2016-09-23 07:26:19
【问题描述】:
我想了解其中包含完成处理程序方法的 for 循环的行为。
请参阅下面的示例,我正在尝试获取 2 个地址的纬度/经度坐标。
let addressArray = ["1 Infinite Loop, Cupertino", "809, Harvard Ave, Sunnyvale, CA - 94087"]
var coordinatesArray = [CLLocationCoordinate2D]()
for i in 0 ..< addressArray.count {
print(i)
let address = addressArray[i]
geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in
print("Address = \(address)");
if let placemark = placemarks?.first {
let coordinate = placemark.location?.coordinate
self.coordinatesArray.append(coordinate!)
}
})
}
// Do something here after that that
输出是这样的
0
1
Address = 1 Infinite Loop, Cupertino
我想知道为什么代码中没有打印另一个地址。第二个 for 循环是否没有调用 geocodeAddressString 方法。假设 for 循环结束后应用程序执行还没有结束,我还做了很多其他的事情。
【问题讨论】:
-
这真的是输出还是你输入的?最后一行不应该像
Address = something -
您发布的代码未直接连接到输出,请使用从代码和控制台复制粘贴;你也打印
address,这是什么? -
更新了代码和输出。
-
您应该注意这种类型的异步循环请求中的竞争条件。英子提到here
-
这就是我想知道的,异步循环请求的竞争条件行为。