0

Я пытаюсь сделать обратное геокодирование с текущим местоположением, получить город и состояние и сохранить его в объекте CoreData. В приведенном ниже коде, как только кнопка сохранения нажата пользователем, я ожидаю, что произойдет обратное геокодирование и сохранит информацию о городе и состоянии в Core Data. Но когда я пытаюсь выполнить код ниже, обратная часть геокодирования не выполняется и данные не сохраняются в Core Data. Один указатель, который я нашел в других потоках, заключается в том, что обратное геокодирование происходит в независимом потоке, и более поздняя часть этой функции запускается без обратного геокодирования. Может ли кто-нибудь посоветовать мне, как это сделать? Я по-прежнему новичок в разработке приложений для iOS, поэтому подробный ответ будет высоко оценен. Заранее спасибо!Как сохранить данные из обратного преобразования в CoreData в Objective-C?

- (IBAction)save:(id)sender { 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

    //Update current location 
    [self.locationManager startUpdatingLocation]; 

    // Reverse Geocoding 
    NSLog(@"Resolving the Address"); 
    [geocoder reverseGeocodeLocation:self.locationManager.location completionHandler:^(NSArray *placemarks, NSError *error) 
    { 
     NSLog(@"Found placemarks: %@, error: %@", placemarks, error); 
     if (error == nil && [placemarks count] > 0) { 
      placemark = [placemarks lastObject]; 
     } else { 
      NSLog(@"%@", error.debugDescription); 
     } 
    } ]; 

    NSManagedObjectContext *context = [self managedObjectContext]; 

    // Create a new device 
    NSManagedObject *newPlace = [NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:context]; 
    [newPlace setValue:placemark.locality forKey:@"city"]; 
    [newPlace setValue:placemark.administrativeArea forKey:@"state"]; 

    NSError *error = nil; 
    // Save the object to persistent store 
    if (![context save:&error]) { 
     NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
    } 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 
+1

'reverseGeocodeLocation' - это асинхронный вызов. Если вам нужно что-то сделать с помощью метки «placemark», переместите код в обработчик завершения. – Sulthan

+0

Я попытался сделать то, что предложил DeveloBär ниже в своем ответе, но столкнулся с проблемой, как описано ниже в моем комментарии. – hellSigma

ответ

0

Попробуйте это:

- (IBAction)save:(id)sender { 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

    //Update current location 
    [self.locationManager startUpdatingLocation]; 

    // Reverse Geocoding 
    NSLog(@"Resolving the Address"); 
    [geocoder reverseGeocodeLocation:self.locationManager.location completionHandler:^(NSArray *placemarks, NSError *error) 
    { 
     NSLog(@"Found placemarks: %@, error: %@", placemarks, error); 
     if (error == nil && [placemarks count] > 0) { 
      placemark = [placemarks lastObject]; 

      NSManagedObjectContext *context = [self managedObjectContext]; 

      // Create a new device 
      NSManagedObject *newPlace = [NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:context]; 
      [newPlace setValue:placemark.locality forKey:@"city"]; 
      [newPlace setValue:placemark.administrativeArea forKey:@"state"]; 

      NSError *error = nil; 
      // Save the object to persistent store 
      if (![context save:&error]) { 
       NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
      } 

      [self dismissViewControllerAnimated:YES completion:nil]; 

     } else { 
      NSLog(@"%@", error.debugDescription); 
     } 
    }]; 

} 

Как вы можете видеть, что я поставил код для сохранения данных внутри обратной связи обратного вызова. Обратный вызов является асинхронным и вызывается после того, как информация стала доступной (что может занять время, например, 2 секунды). Если вы попытаетесь сохранить данные до их получения, вы ничего не сохраните.

+0

Спасибо за ответ. Ваше решение имеет смысл, и я попробовал, но когда я это делаю, ничего не происходит, когда я нажимаю кнопку «Сохранить». В основном обработчик завершения все еще не выполняется. Я поставил точку останова в 'NSManagedObject * newPlace = [NSEntityDescription insertNewObjectForEntityForName: @" Место "inManagedObjectContext: context];' но эта точка останова никогда не попадает. Хотя я вижу «Разрешение адреса» в NSlog, который доказывает, что это только код обработчика завершения, который пропускается. Нужно ли мне что-то делать, чтобы вызвать код обработчика завершения? – hellSigma

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

  • Нет связанных вопросов^_^