CLGeocoder возвращает (null) в NSString, но не в NSLog

У меня проблема с CLGeocoder, если я попытаюсь получить имя адреса, используя CLGeocoder, и текущие координаты пользователя, он правильно вернет имя адреса, почтовый индекс, штат и т. д. в NSLog, но если я попытаюсь отправить эту информацию в NSString [содержится в NSMutableArray, но я не думаю, что это проблема] возвращает значение (null). Я подозреваю, что эта проблема вызвана блоком, который я использовал в коде, но я не уверен, и я все равно не знаю, как решить эту проблему.

Вот мой код:

- (NSArray *)dataArrayPosizione
{
    if (self.arrayPosizione == nil)
    {

        reverseGeocoder = [[CLGeocoder alloc] init];

        locationToReverseGeocode = [[CLLocation alloc]initWithLatitude:self.mapView.userLocation.location.coordinate.latitude longitude:self.mapView.userLocation.location.coordinate.longitude];

        [reverseGeocoder reverseGeocodeLocation:locationToReverseGeocode completionHandler:^(NSArray *placemarks, NSError *error)
        {
            if (placemarks && placemarks.count > 0)
            {
                placemark = placemarks[0];

                NSLog(@"\n%@ %@\n%@, %@, %@\n%@", [placemark subThoroughfare],[placemark thoroughfare], [placemark locality], [placemark administrativeArea], [placemark postalCode], [placemark country]);
            }
        }];

        informazioniPosizione = [NSMutableArray new];

        [informazioniPosizione addObject:[NSString stringWithFormat:@"Indirizzo: %@", [placemark country]]];
        [informazioniPosizione addObject:[NSString stringWithFormat:@"Latitudine: %g\u00B0\nLongitudine: %g\u00B0", self.mapView.userLocation.location.coordinate.latitude, self.mapView.userLocation.location.coordinate.longitude]];

        self.arrayPosizione = informazioniPosizione;
    }

    return self.arrayPosizione;
}

И картинка: введите здесь описание изображения

Может кто-нибудь, пожалуйста, помогите мне с этим? Если размещенного кода недостаточно для понимания проблемы, я вставлю больше строк.

Спасибо


person Aluminum    schedule 27.01.2014    source источник


Ответы (2)


Вы создаете свою строку перед выполнением блока геокодирования. Это должно выглядеть так:

- (NSArray *)dataArrayPosizione
{
    if (self.arrayPosizione == nil)
    {

        reverseGeocoder = [[CLGeocoder alloc] init];

        locationToReverseGeocode = [[CLLocation alloc]initWithLatitude:self.mapView.userLocation.location.coordinate.latitude longitude:self.mapView.userLocation.location.coordinate.longitude];

        [reverseGeocoder reverseGeocodeLocation:locationToReverseGeocode completionHandler:^(NSArray *placemarks, NSError *error)
        {
            informazioniPosizione = [NSMutableArray new];

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

                NSLog(@"\n%@ %@\n%@, %@, %@\n%@", [placemark subThoroughfare],[placemark thoroughfare], [placemark locality], [placemark administrativeArea], [placemark postalCode], [placemark country]);

                [informazioniPosizione addObject:[NSString stringWithFormat:@"Indirizzo: %@", [placemark country]]];
                [informazioniPosizione addObject:[NSString stringWithFormat:@"Latitudine: %g\u00B0\nLongitudine: %g\u00B0", self.mapView.userLocation.location.coordinate.latitude, self.mapView.userLocation.location.coordinate.longitude]];

            }

            self.arrayPosizione = informazioniPosizione;

            return self.arrayPosizione;
        }];

    }

}
person bachonk    schedule 27.01.2014
comment
Здравствуйте @bachonk, я попробовал ваш код, но вот результат: -/ i.imgur.com/kCo7ZvQ .png в любом случае спасибо за ответ :-) - person Aluminum; 27.01.2014
comment
Вы возвращали пустой массив до того, как блок был выполнен. Я соответствующим образом обновил свой код, но учтите, что это не самый рекомендуемый способ справиться с этим. - person bachonk; 27.01.2014
comment
Нет, какой код и где я должен указать, чтобы обновить мой UITableView? Спасибо за помощь и потраченное время :-) - person Aluminum; 27.01.2014
comment
Предполагая, что ваше табличное представление использует self.arrayPosizione в своем источнике данных, вы захотите вызвать [tableView reloadData] сразу после установки этого значения в строке self.arrayPosizione = informazioniPosizione;. - person bachonk; 27.01.2014

Блок CLGeocoder будет выполняться асинхронно, поэтому переменная метки еще не установлена, когда вы пытаетесь ее использовать. Как предлагает Бачонк, переместите код в блок геокодера. После того, как вы добавите информацию о метке в массив, вам просто нужно вызвать -[UITableView reloadData] в вашем tableView, и информация появится.

person Gianluca Tranchedone    schedule 27.01.2014