2016-12-19 3 views
0

Я хочу узнать местоположение фотографий с помощью reverseGeocodeLocation. Я использую функцию нижеПолучить имя места от reverseGeocodeLocation

@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.

CLLocation *loc = asset.location; 
NSString *currentLocation = [self getLocation:loc]; 

Где я должен изменить свой код. Пожалуйста помоги.

+0

печать 'placemark.name' ниже' lacemark = [меткам lastObject], линии (в обработчике завершения) 'и скажите мне, он будет дает никакого значения или нет ! – Lion

+0

NSLog (@ "addressDictionary% @", placemark.addressDictionary); его адрес печати ваших координат. in side [geocoder reverseGeocodeLocation: места завершенияHandler:^(NSArray * _Невершимые метки, NSError * _Удальная ошибка) { placemark = [placemarks lastObject]; }]; –

+0

Правильно, но я хочу использовать значение вне блока для каждого вызова метода. @Lion – sazid008

ответ

0

Метод reverseGeocodeLocation класса CLGeocoder работает асинхронно, поэтому вы не получите данные о местоположении как возвращаемое значение вызываемой функции. Он использует обработчик завершения, в котором данные местоположения возвращаются, и вы можете использовать этот блок обработчика завершения для обновления пользовательского интерфейса или дальнейшей обработки ваших данных местоположения.

+0

Точно. Я получаю значение внутри блока, но не снаружи. Можете ли вы показать мне, как я могу обновить «currentLocation» с данными о местоположении фотографии в обработчике завершения. Я пробовал, но не обновлялся. @Gurdev – sazid008

+0

Вы должны изменить 'getLocation()' для возврата 'void', и когда выполняется блок обработчика завершения, объект' placemark 'будет иметь значение местоположения, найденное с помощью 'reverseGeocodeLocation()'. После этого вы сможете получить доступ к его значению.Дайте мне знать, если потребуется дополнительная помощь. –

-1

Получить город, штат и адрес, который вы должны пройти широту и долготу, так проходят широты и долготы будет переходить к блоку и геокодера в блоке вы будете массив меток.

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

Не просто отправьте код. Пожалуйста, объясните, что было не так, и объясните, как ваши ответы решают проблему. – rmaddy

1

Это потому, что вы возвращаете значение, прежде чем вы получите его в завершении обработчика reverseGeocodeLocation. Теперь, вы не можете вернуть значение из любого completion block так, что вам нужно сделать, это создать свой собственный completionblock и назовите его, когда вы получите свой результат что-то подобное,

-(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); 

}]; 

} 

и назвать его, как,

[self getLocation:location withcompletionHandler:^(NSString *name) { 

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

Update:

Если вы хотите весь массив в обработчик завершения, как вы упомянули в комментарии, то ваш метод должен быть как,

-(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); 

}]; 

} 

и вы можете назвать это как,

[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]; 

}]; 
+0

Такая же проблема Я получил имя только внутри блока '[self getLocation: location withcompletionHandler:^(NSString * name) {}] ;, но мне нужно обновить currentLocation. @Lion – sazid008

+0

то чего вы хотите? вы можете добавить дополнительные параметры в метод, если хотите другие вещи. Я не понимаю тебя! чего вы хотите добиться именно? – Lion

+0

Хорошо, дайте мне очистить. 'currentLocation' объявляется вне блока' [self getLocation: location withcompletionHandler:^(NSString * name) {}]; '. В результате я не могу получить 'имя' вне блока' [self getLocation: location withcompletionHandler:^(NSString * name) {}]; 'и не может обновить мой' currentLocation'. Но мне нужно обновить 'currentLocation' для дальнейшей операции. – sazid008

Смежные вопросы