后台线程的核心数据未保存/持久化

时间:2016-05-14 22:31:22

标签: ios swift multithreading core-data

我遇到的问题是,在后台线程上保存到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)
    }
  }
}

有谁知道我哪里出错了?

由于

0 个答案:

没有答案