使用 Core Data 保存后台位置更新
Posted
技术标签:
【中文标题】使用 Core Data 保存后台位置更新【英文标题】:Using Core Data to save background location updates 【发布时间】: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)。
【问题讨论】:
【参考方案1】:位置大约每秒更新一次,用坐标创建一个 NSMutableArray,保存一个坐标列表,当它到达一个点时,用可变数组中的坐标创建一个 NSArray,清除 NSMutableArray,传递 NSArray实例到后台线程,并执行保存。
编辑:根据新信息:CLLocationManager 的方法是异步的。如果这是您想要完成的,您可以做的是调度一个后台块并在您的委托回调的块内创建您的实体。您甚至可以管理自己的串行 dispatch_queue 来执行此操作。
考虑到你,仅仅因为你正在做某事它的背景并不能使它有效。每次获得新位置(可能每 1-2 秒)时,您仍会调用 save。写入持久存储是昂贵的。
【讨论】:
我编辑了我的问题以便更清楚,因为这个回复没有回答我的问题。感谢您抽出宝贵时间回复。以上是关于使用 Core Data 保存后台位置更新的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序后台运行时,Core Data 无法通过区域监控保存上下文
Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存
在后台线程上安全保存 Core Data 托管对象上下文的正确方法?
在使用 NSFetchedResultsController 更新 UITableView 时将来自 Web 的数据保存到 Core Data