NSManagedObjectContext.performAndWait {}导致崩溃

问题描述

我不确定我在做什么错,但是由于这个原因,我的应用程序崩溃了。这是我在AppDelegate中的coredata堆栈,如下所示。

lazy var viewContext: NSManagedObjectContext = {
return self.persistentContainer.viewContext
}()

lazy var cacheContext: NSManagedObjectContext = {
return self.persistentContainer.newBackgroundContext()
}()

lazy var updateContext: NSManagedObjectContext = {
let _updateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
_updateContext.parent = self.viewContext
return _updateContext
}()

然后我创建了一个Singleton类来管理我的CoreData操作。

class StorageManager:NSObject {

  private override init() {}

  private static var SMInstance: StorageManager?

  public static var shared : StorageManager {
    if SMInstance == nil {
      SMInstance = StorageManager()
    }

    return SMInstance!
  }



//Represent a single context for all the operations with lazy loading
lazy var managedObjectContext : NSManagedObjectContext = {
      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      appDelegate.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
      return appDelegate.viewContext
}()


lazy var privateMOC : NSManagedObjectContext = {
         let appDelegate = UIApplication.shared.delegate as! AppDelegate
         return appDelegate.updateContext
}()


 private func synchronize() {
  do {

    try self.privateMOC.save() 

      self.managedObjectContext.performAndWait {
          do {
            try self.managedObjectContext.save()

            print("Saved to main context")
          } catch {
            print("Could not synchonize data. \(error),\(error.localizedDescription)")
          }

      }
  } catch {
    print("Could not synchonize data. \(error),\(error.localizedDescription)")
  }

 }

}

将数据保存到同一类中的示例保存方法如下。但这有时会给我这个错误

***由于未捕获的异常'NSGenericException'而终止应用程序, 原因:'***集合<__ nscfset>在 被枚举...

func savedata() {     

  DispatchQueue.main.async(execute: {

   let entity = User(context: self.privateMOC)
       
     entity.name = "JOHN PAUL"
        
    //IT crash here
     self.privateMOC.performAndWait {
          self.synchronize()
      }

  })

}

解决方法

此错误可能是因为您正在后台上下文中创建User实体,但在主线程上执行了操作。

删除DispatchQueue.main.async

有关核心数据和线程的更多信息,请阅读here

编辑:在私有/背景上下文中创建对象/实体应该是这样的:

let privateMOC = self.privateMOC
privateMOC.performAndWait {
     let entity = User(context: privateMOC)
     entity.name = "JOHN PAUL"
     self.synchronize(privateMOC: privateMOC)
} 

此外,同步功能应如下所示:

private func synchronize(privateMOC: NSManagedObjectContext) {
  do {

    try privateMOC.save() 

      DispatchQueue.main.async {
          self.managedObjectContext.performAndWait {
          do {
            try self.managedObjectContext.save()

            print("Saved to main context")
          } catch {
            print("Could not synchonize data. \(error),\ (error.localizedDescription)")
          }

      }
    }
  } catch {
    print("Could not synchonize data. \(error),\(error.localizedDescription)")
  }

 }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...