我正在尝试设置一个应用程序,以便有一个后台任务,其中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)。
答案 0 :(得分:0)
每隔一秒左右更新一次位置,用坐标创建一个NSMutableArray,保留一个坐标列表,当它到达一个点时,用可变数组的坐标创建一个NSArray,清除NSMutableArray,传递NSArray实例到后台线程,并执行保存。
编辑:基于新信息:CLLocationManager的方法是异步的。您可以做的是,如果这是您要完成的任务,则调度后台块并在您的委托回调中的块内创建您的实体。您甚至可以管理自己的串行dispatch_queue来执行此操作。
考虑到你,仅仅因为你正在做某事,它背景不会使它变得有效。每次获得新位置(可能每1-2秒),您仍然会调用save。写入持久性存储是很昂贵的。