我遇到的问题是,在后台线程上保存到Core Data的对象不会保留在sqlite数据库中。
在每个backgroundFetch事件中,我的应用程序从CMMotionActivityManager读取活动识别数据,并将活动保存到Core Data中。当应用程序位于前台时,此过程完全正常。
我使用受https://christiantietze.de/posts/2015/10/unit-of-work-core-data-transaction/启发的工作单元设计模式来处理单独的ManagedObjectContexts,并执行类似sql的事务。我已注册NSManagedObjectContextDidSaveNotification
,以便将其他上下文的更改合并到主要上下文。
我有一个类CoreDataTransaction.swift
来设置和执行核心数据代码 - 它还包含mergeContexts函数:
init(backgroundContext: NSManagedObjectContext, mainContext: NSManagedObjectContext){
self.managedObjectContext = backgroundContext
self.parentManagedObjectContext = mainContext
super.init()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "mergeContexts:", name: NSManagedObjectContextDidSaveNotification, object: self.managedObjectContext)
}
func execute(closure: (context: NSManagedObjectContext) throws -> Void){
managedObjectContext.performBlockAndWait { () -> Void in
do {
try closure(context: self.managedObjectContext)
}catch let error as NSError{
self.errorHandler?(error)
return
}
do {
print("saving managedObjectContext")
try self.managedObjectContext.save()
}catch let error as NSError{
self.errorHandler?(error)
return
}
self.parentManagedObjectContext.performBlock({
do {
print("saving parentManagedObjectContext")
try self.parentManagedObjectContext.save()
} catch let error as NSError{
self.errorHandler?(error)
return
}
})
}
}
func mergeContexts(notification: NSNotification) {
let savedContext = notification.object as! NSManagedObjectContext
if(!NSThread.isMainThread()){
self.performSelectorOnMainThread("mergeContexts:", withObject: notification, waitUntilDone: true)
return
}
if(parentManagedObjectContext.persistentStoreCoordinator == savedContext.persistentStoreCoordinator){
print("parentManagedObjectContext.persistentStoreCoordinator == savedContext.persistentStoreCoordinator")
return
}
if(savedContext == self.managedObjectContext){
parentManagedObjectContext.performBlockAndWait { () -> Void in
print("merging changes")
self.parentManagedObjectContext.mergeChangesFromContextDidSaveNotification(notification)
}
}
}
有谁知道我哪里出错了?
由于