在私有MOC中处理核心数据多线程执行的正确方法是什么,以避免意外崩溃

问题描述

根据苹果指南,必须在后台线程上实例化NSManagedObjectContext。因此,我在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 = Community(context: self.privateMOC)
           
         entity.name = "JOHN PAUL"
            
         self.privateMOC.performAndWait {
              self.synchronize()
          }
    
     })

 }

 

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

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