столкнулся с проблемой с «automaticMergesChangesFromParent» в родительско-дочернем контексте в coredata? - PullRequest
0 голосов
/ 29 октября 2018

У меня возникла проблема со свойством CoreData automaticallyMergesChangesFromParent. Позвольте мне сначала рассказать вам о структуре контекста. writerContext (privateQ) -> tempContext (PrivateQ - дочерний объект writerContext), viewContext (mainQ - дочерний объект writerContext), updateContext (PrivateQ - дочерний объект writerContext) . Я сделал automaticallyMergesChangesFromParent параметр, настраиваемый для viewContext. Потому что я хочу, чтобы пользователь хотел, чтобы любые изменения, выполненные в tempContext / updateContext, были объединены в viewContext, что можно сделать через свойство automaticallyMergesChangesFromParent. Но когда пользователь установил automaticallyMergesChangesFromParent = false, тогда эти изменения не должны отражаться на viewContext.

Код: -

** Но поведение, с которым я сталкиваюсь, совершенно иное. Позвольте мне поделиться кодом.

private func getViewContext()-> NSManagedObjectContext? {
    let writerContext = coredataStack?.getPrivateWriterContext()
    if viewContext == nil && writerContext != nil {
         viewContext = WynkManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
         //viewContext.undoManager = nil
         viewContext.parent = writerContext
     }
     viewContext.automaticallyMergesChangesFromParent = self.shouldMegreBackGroundChangesInViewContext
     print("viewContext.automaticallyMergesChangesFromParent : \(viewContext.automaticallyMergesChangesFromParent)")
     return viewContext
 }

В моем viewcontroller следующий код: -

func updateAllObjects() {
    if let context = CoreDataManager.sharedInstance.getContext(type: OperationType.Other, screenID: "FirstView") {
         context.perform {
             //let allObjects = User.fetch(in: context, includePending: true, returnsObjectsAsFaults: false, predicate: nil, sortedWith: nil)
             for oID in self.fetchedObjectIDS {                        
                 let exObject = context.object(with: oID) as? User
                 exObject?.name = "NewName"
                 print("upated user objects : \(String(describing: exObject))")
             }
             /*for object in allObjects {
                 object.name = "NewName"
                 print("upated user objects : \(String(describing: object))")
             }*/
             CoreDataManager.sharedInstance.saveContext(context: context, opType: OperationType.Other, completion: { (error) in
                 DispatchQueue.main.async(execute: {
                     self.coreDataTableView.reloadData()
                 })                     CoreDataManager.sharedInstance.resetObjects(context: context)
                 CoreDataManager.sharedInstance.disPoseTempContext(object: context, screenID: "FirstView", completion: { (isDisposed) in
                     print("TempContext for 'FirstView' is disposed")
                 })
             })
         }
     }
 }

 func fetchDataAndShow(withObjectsIds mObjectIds : [NSManagedObjectID]) {
     CoreDataManager.sharedInstance.setShouldMegreBackGroundChangesInViewContext(value: true)
     if let viewContext = CoreDataManager.sharedInstance.getContext(type: OperationType.UI, screenID: nil) {
         viewContext.perform {[weak self] in
             self?.coreDataTableView.delegate = self
             self?.coreDataTableView.dataSource = self
             if(mObjectIds.count > 0) {
                 for oID in mObjectIds {
                     if let exObject = viewContext.object(with: oID) as? User {
                         self?.managedObjects.append(exObject)
                         print("exObject : \(String(describing: exObject.name))")
                     }
                 }
             }else {
                 let allObjects = User.fetch(in: viewContext, includePending: true, returnsObjectsAsFaults: true, predicate: nil, sortedWith: nil)
                 self?.managedObjects.append(contentsOf: allObjects)
             }
             CoreDataManager.sharedInstance.resetObjects(context: viewContext)
             DispatchQueue.main.async(execute: {
                 self?.coreDataTableView.reloadData()
                 self?.timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: false, block: { (timer) in
                     self?.updateAllObjects()
                 })
             })
         }
     }
 }


func insertValues() {
     var counter = 20000
     var savingCounter = 0
     let name = "User"
     let age = "age"
     if let context = CoreDataManager.sharedInstance.getContext(type: OperationType.Other, screenID: "FirstView") {
         context.perform {[weak self] in
             while counter > 0 {
                 counter = counter - 1
                 savingCounter = savingCounter + 1
                 let userEntity = User.entity(in: context)
                 if let objectTuple = User.insertObject(context: context, entity: userEntity) {
                     let newObject = objectTuple.object as? User
                     newObject?.name = "\(name)\(counter)"
                     newObject?.age = "\(age)\(counter)"
                     print("newObjects :- \(String(describing: newObject))")
                     self?.fetchedObjectIDS.append(objectTuple.objectID)
                 }
                 if(counter == 0) {
                     print("savingCounter \(savingCounter)")
                     print("counter \(counter)")
                     CoreDataManager.sharedInstance.saveContext(context: context, opType: OperationType.Other) { (error) in
                         if(error == nil) {
                             print("Data Saved")
                         }else {
                             print("Error : \(String(describing: error?.domain))")
                             print("Error : \(String(describing: error?.errorCode))")
                         }
                         DispatchQueue.main.async(execute: {
                             self?.completionHandler((self?.fetchedObjectIDS)!)
                         })
                         if(counter == 0) {
                             CoreDataManager.sharedInstance.resetObjects(context: context)
                             CoreDataManager.sharedInstance.disPoseTempContext(object: context, screenID: "FirstView", completion: { (isDisposed) in
                                 print("TempContext for 'FirstView' is disposed")
                             })
                         }
                     }
                 }
             }
         }
     }
 }
...