【发布时间】:2018-07-20 16:08:06
【问题描述】:
我想模拟从 Javascript 到 Swift 4 的 async 和 await 请求。我搜索了很多关于如何做到这一点,我想我找到了 DispatchQueue 的答案,但我不明白它是如何工作的。
我想做一件简单的事情:
if let items = result.value {
var availableBornes = [MGLPointFeature]()
for item in items {
guard let id = item.id else { continue }
let coordinate = CLLocationCoordinate2D(latitude: Double(coor.x), longitude: Double(coor.y))
// ...
// This is an asynchronous request I want to wait
await _ = directions.calculate(options) { (waypoints, routes, error) in
guard error == nil else {
print("Error calculating directions: \(error!)")
return
}
// ...
if let route = routes?.first {
let distanceFormatter = LengthFormatter()
let formattedDistance = distanceFormatter.string(fromMeters: route.distance)
item.distance = formattedDistance
// Save feature
let feature = MGLPointFeature()
feature.attributes = [
"id": id,
"distance": formattedDistance
]
availableBornes.append(feature)
}
}
}
// This should be called after waiting for the async requests
self.addItemsToMap(availableBornes: availableBornes)
}
我该怎么办?
【问题讨论】:
-
您的问题中没有 Javascript。您发布的 Swift 代码到底有什么问题?你的问题很不清楚。
-
别等了。请学习理解 Swift 中的异步数据处理。在您的示例中,只需将行
self.addItemsToMap(availableBornes: availableBornes)放入完成块。 -
不,我不能,因为我必须等待 for 完成。我的异步查询将被调用 items.count 次。
-
然后使用
DispatchGroup。它提供enter和leave语句,并且可以在最后一次迭代完成时notify。请看stackoverflow.com/questions/44912000/… -
听起来你想要一个 DispatchGroup。一旦你尝试了普通的计算机代码,你就再也不会使用“承诺”了:-O ;)
标签: ios swift asynchronous async-await