У меня возникла проблема со свойством 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")
})
}
}
}
}
}
}
}