0

我正在尝试设置一个应用程序,以便有一个后台任务,其中 locationManager 接收然后使用核心数据存储的更新。这是我用来将 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 合并(据我所知,当应用程序运行时)在后台运行的新核心数据实体无法存储到我的主线程 ManagedObjectContext)。

4

1 回答 1

0

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

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

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

于 2012-08-18T00:19:55.783 回答