【发布时间】:2021-05-05 18:43:38
【问题描述】:
我是 swift 新手。对于我的项目,我需要使用谷歌地理编码并将结果放入文本中。对于用户界面,我使用的是 swiftUI。我尝试对 Completition Handler 做同样的事情,但没有奏效。下面我用 DispatchQueue 和 DispatchGroup 完成了代码,但是当我尝试使用这个函数时,整个应用程序冻结了。请帮我解决一下这个。 UI 的代码只是一个调用函数的文本。
func reverseGeocoding(lat: Double, lng: Double) -> String{
var place:String?
let url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=\(lat),\(lng)&key=KEY"
let group = DispatchGroup()
group.enter()
DispatchQueue.global(qos: .default).async {
AF.request(url).responseJSON{ response in
// group.leave()
guard let data = response.data else {
return
}
do {
let jsonData = try JSON(data: data)
let result = jsonData["results"].arrayValue
for result in result {
let address_components = result["types"].arrayValue
for component in address_components {
if(component == "locality"){
place = result["formatted_address"].stringValue
}
}
}
} catch let error {
print(error.localizedDescription)
}
}
}
group.wait()
return place ?? ""
}
【问题讨论】:
-
别等了。滥用
DispatchGroup使网络请求同步也是错误的。完成处理程序是推荐的方式。你有什么问题? -
如何使用完成处理程序制作文本视图。我试过了,但没有用。你能告诉我如何使用完成处理程序将结果放入文本视图中
-
这个 UI 是用 UIKit 还是 SwiftUI 构建的?
-
它是为 SwiftUI 构建的
标签: swift asynchronous swiftui google-geocoding-api