首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从reverseGeocodeLocation获取位置名称

从reverseGeocodeLocation获取位置名称
EN

Stack Overflow用户
提问于 2016-12-19 06:58:02
回答 3查看 993关注 0票数 0

我想用reverseGeocodeLocation找出照片的位置。我使用下面的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@interface GalleryPhotosViewController ()
{
CLPlacemark *placemark;
}
@end

-(NSString *)getLocation:(CLLocation *)locations{
CLGeocoder *geocoder = [CLGeocoder new];
[geocoder reverseGeocodeLocation:locations completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    placemark = [placemarks lastObject];
}];
return placemark.name;
}

在调用函数时,我无法获得该名称,但在执行代码的其他部分后,我获得了该名称。我知道reverseGeocodeLocation有一个完成块,当执行到达它时,它被移交给另一个线程。但我需要在调用函数时获得该名称。我经历了许多解决方案,但都不能解决我的问题。我想接收currentLocation格式的地址名称。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CLLocation *loc = asset.location;
NSString *currentLocation = [self getLocation:loc];

我应该在哪里更改我的代码。请帮帮忙。

EN

回答 3

Stack Overflow用户

发布于 2016-12-19 09:50:48

这是因为您在reverseGeocodeLocation的完成处理程序中获取值之前返回值。现在,您不能从任何completion block返回值,所以您需要做的是创建自己的completionblock,并在获得如下结果时调用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 -(void)getLocation:(CLLocation *)locations withcompletionHandler : (void(^)(NSString *name))completionHandler{


CLGeocoder *geocoder = [CLGeocoder new];
[geocoder reverseGeocodeLocation:locations completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    placemark = [placemarks lastObject];

    completionHandler(placemark.name);

}];

}

叫它像这样,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   [self  getLocation:location withcompletionHandler:^(NSString *name) {

    NSLog(@"your name : %@",name);  // or do whatever you want with name!
}];

更新:

如果像您在注释中提到的那样希望在完成处理程序中使用整个数组,那么您的方法应该是这样,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 -(void)getLocation:(CLLocation *)locations withcompletionHandler : (void(^)(NSArray *arr))completionHandler{



CLGeocoder *geocoder = [CLGeocoder new];
[geocoder reverseGeocodeLocation:locations completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks,
                                                               NSError * _Nullable error) {
   // placemark = [placemarks lastObject];

    completionHandler(placemarks);

}];

}

你可以这样叫它,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [self getLocation:location withcompletionHandler:^(NSArray *arr) {

    // you will get whole array here in `arr`, now you can manipulate it according to requirement
    NSLog(@"your response array : %@",arr);

    CLPlacemark *placemark = [arr lastObject];

}];
票数 1
EN

Stack Overflow用户

发布于 2016-12-19 07:06:54

CLGeocoder的方法reverseGeocodeLocation异步运行,因此您不会从被调用的函数中获得位置数据作为返回值。它使用位置数据返回的完成处理程序,您可以使用该完成处理程序块来更新UI或进一步处理位置数据。

票数 0
EN

Stack Overflow用户

发布于 2016-12-19 07:17:05

获取城市、州和地址您必须传递纬度和经度,因此传递纬度和经度将传递给地理编码器块,并且在块内您将使用位置标记数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    CLLocation *myLocation = [[CLLocation alloc]initWithLatitude:23.0225
                                                        longitude:72.5714];



    [geocoder reverseGeocodeLocation:myLocation
                   completionHandler:^(NSArray *placemarks, NSError *error) {

                       if (error) {
                           NSLog(@"Geocode failed with error: %@", error);
                           return;
                       }

                       if (placemarks && placemarks.count > 0)
                       {
                           CLPlacemark *placemark = placemarks[0];

                           NSDictionary *addressDictionary =
                           placemark.addressDictionary;

                           NSLog(@"%@ ", addressDictionary);
                           NSString *address = [addressDictionary
                                                objectForKey:(NSString *)kABPersonAddressStreetKey];
                           NSString *city = [addressDictionary
                                             objectForKey:(NSString *)kABPersonAddressCityKey];
                           NSString *state = [addressDictionary
                                              objectForKey:(NSString *)kABPersonAddressStateKey];


                           NSLog(@"%@ %@ %@ %@", address,city, state);
                       }

                   }];
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41217273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文