【问题标题】:Using Core Data to save background location updates使用 Core Data 保存后台位置更新
【发布时间】:2012-08-18 00:04:23
【问题描述】:

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

【问题讨论】:

    标签: multithreading core-data core-location


    【解决方案1】:

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

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

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

    【讨论】:

    • 我编辑了我的问题以便更清楚,因为这个回复没有回答我的问题。感谢您抽出宝贵时间回复。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多