使用Core Data保存后台位置更新

时间:2012-08-18 00:04:24

标签: multithreading core-data core-location

我正在尝试设置一个应用程序,以便有一个后台任务,其中locationManager接收更新,然后使用Core Data存储这些更新。这是我用来运行locationManager作为后台任务的代码:

(void)viewDidLoad
{
    [super viewDidLoad];

timerAndMap = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [self endDate];
     }];

        if(nil == locationManager) {
        locationManager = [[CLLocationManager alloc] init];
        }

    locationManager.delegate = self;
    locationManager.distanceFilter = 500;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];

  [[UIApplication sharedApplication] endBackgroundTask:timerAndMap];

}

然而,我遇到的问题是弄清楚如何使委托方法成为后台线程的一部分。当locationManager调用didUpdateToLocation时,我想将新位置的经度,纬度和日期保存为临时managedObjectContext中实体的属性,然后将其与我在主线程上建立的ManagedObjectContext合并(至于我对应用程序的理解)在后台运行新的Core Data实体无法存储到我的主线程ManagedObjectContext)。

1 个答案:

答案 0 :(得分:0)

每隔一秒左右更新一次位置,用坐标创建一个NSMutableArray,保留一个坐标列表,当它到达一个点时,用可变数组的坐标创建一个NSArray,清除NSMutableArray,传递NSArray实例到后台线程,并执行保存。

编辑:基于新信息:CLLocationManager的方法是异步的。您可以做的是,如果这是您要完成的任务,则调度后台块并在您的委托回调中的块内创建您的实体。您甚至可以管理自己的串行dispatch_queue来执行此操作。

考虑到你,仅仅因为你正在做某事,它背景不会使它变得有效。每次获得新位置(可能每1-2秒),您仍然会调用save。写入持久性存储是很昂贵的。