如何在Objective-C中将数据从反向编码保存到CoreData?

时间:2015-12-14 20:55:57

标签: ios objective-c core-data reverse-geocoding reversegeocodelocation

我正在尝试使用当前位置进行反向地理编码,检索城市和州并将其保存到CoreData实体。在下面的代码中,只要用户点击了保存按钮,我就会发生反向地理编码并将城市和州信息保存到Core Data。但是当我尝试执行下面的代码时,不执行反向地理编码部分,也没有数据保存到Core Data。我在其他线程中找到的一个指针是反向地理编码发生在一个独立的线程中,后来该函数的一部分被启动而没有发生反向地理编码。有人可以指导我如何处理这个问题吗?我还是iOS应用程序开发的新手,因此非常感谢您的详细回复。提前致谢!

- (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 个答案:

答案 0 :(得分: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秒)。 如果您在收到数据之前尝试保存数据,那么您确实不会存储数据。