- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
为了响应用户操作,我想将 CLLocation 转换为地址字符串并将其显示回用户。
因此顺序是1. 用户 Action 触发序列2. ReverseGeocoder 向Apple 服务器发出请求并异步返回结果。3. 向用户显示结果。
如果我在完成 block 中有一个专用的显示部分的方法,我就能够显示结果,如下所示:
func userWantsAddress {
displayAddressFrom(location: myLocation)
}
func displayAddressFrom(location: CLLocation) {
CLGeocoder().reverseGeocodeLocation(location) { (placemark, error) in
if error != nil {
print("error")
} else {
let place = placemark! as [CLPlacemark]
if place.count > 0 {
let place = placemark![0]
var addressString : String = ""
if place.subThoroughfare != nil {
addressString = addressString + place.subThoroughfare! + "\n"
}
if place.thoroughfare != nil {
addressString = addressString + place.thoroughfare! + " in "
}
if place.locality != nil {
addressString = addressString + place.locality!
}
if place.subAdministrativeArea != nil {
addressString = addressString + ", "+place.subAdministrativeArea!
}
//THIS IS WHERE YOU DISPLAY
myLabel.text = "THE LOCATION IS \(addressString)"
print("the location is",addressString)
}
}
}
}
然而,我想做的是简化代码,因此一旦获得结果,将它们返回到闭包中以进行自定义调用方法,这样我就可以重用 addressFromString 方法(并且不必重写每次我想将位置转换为地址时都会使用它)但我无法弄清楚语法。
我想我需要给第一个方法一个完成 block 来等待第二个方法完成。并在闭包中获得第二个返回结果:类似于:
func userWantsAddress(location: myLocation completion:@escaping (_ response:String)->()){
displayAddressFrom(location: myLocation completion:completion) {
completion("HERE IS YOUR ADDRESS")
}
然而,我似乎无法做到这一点
对于如何执行此操作的任何建议,我们将不胜感激。
最佳答案
您只需要向您的方法添加一个完成处理程序并在调用完成时返回第一个地标:
func displayAddressFrom(location: CLLocation, completion: @escaping (CLPlacemark?, Error?) -> ()) {
CLGeocoder().reverseGeocodeLocation(location) {
completion($0?.first, $1)
}
}
let location = CLLocation(latitude: -22.963451, longitude: -43.198242)
displayAddressFrom(location: location) { placemark, error in
guard let placemark = placemark, error == nil else { return }
// Update your UI from the main thread
DispatchQueue.main.async {
// UI update here
print(placemark)
}
}
Morro da Saudade, Morro da Saudade, Rua Casuarina, 443, Lagoa, Rio de Janeiro - RJ, 22011-040, Brazil @ <-22.96345100,-43.19824200> +/- 100.00m, region CLCircularRegion (identifier:'<-22.96345100,-43.19824200> radius 141.83', center:<-22.96345100,-43.19824200>, radius:141.83m)
如果您需要地标中的邮寄字符串,您可以获取其 postalAddress 并使用 CNPostalAddressFormatter string(for:) 方法从中创建一个字符串:
import Contacts
extension CNPostalAddress {
var mailingAddress: String {
return CNPostalAddressFormatter.string(from: self, style: .mailingAddress)
}
}
DispatchQueue.main.async {
// UI update here
print(placemark.postalAddress?.mailingAddress ?? "") // "Rua Casuarina, 443\nLagoa\nRio de Janeiro RJ\n22011-040\nBrazil"
}
Rua Casuarina, 443 Lagoa Rio de Janeiro RJ 22011-040 Brazil
关于ios - 在 Swift 中显示 reverseGeocoder 结果的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52899366/
我正在使用 skobbler 的 SKMap sdk,一切都很好,但是在进一步开发时,我发现当我进行离线地理编码时,SDK 没有提供太多详细信息,这是我的要求。 我正在使用以下代码 SKSearchR
我正在尝试从坐标中找到用户的位置以保存到我的数据库中。 要查找位置名称,我正在使用 reverseGeocode。然而,由于它是一个 block 方法,我的 self.locationName 将返回
我正在将 Appcelerator Titanium 用于已上线一年多的移动应用程序。 3 天前,反向地理定位在没有任何应用程序更新的情况下停止工作。 我调试了应用程序并使用 Ti.Geolocati
所以我试图根据触摸 MKMapView 获取 CLLocation。然后我试图对位置进行反向地理编码。 if (gestureRecognizer.state == UIGestureReco
为了响应用户操作,我想将 CLLocation 转换为地址字符串并将其显示回用户。 因此顺序是1. 用户 Action 触发序列2. ReverseGeocoder 向Apple 服务器发出请求并异步
全部。 我正在使用 Google map 服务 Java 客户端 ( https://github.com/googlemaps/google-maps-services-java ) 在我的应用中提
我正在构建一个 iOS 应用程序,它在其中一个功能中实现了反向地理编码,以通过用户在 map 上的手势点击获取街道地址。 当使用 CLGeocoder 的反向地理编码功能运行应用程序时,我只能获得城市
我是一名优秀的程序员,十分优秀!