gpt4 book ai didi

ios - 核心数据上下文合并(在子上下文中创建的对象)

转载 作者:行者123 更新时间:2023-11-28 23:35:59 26 4
gpt4 key购买 nike

我有带有持久容器的主上下文、持久编辑上下文(主上下文的子上下文)和用于长时间同步的专用同步上下文。

然后我在编辑上下文中创建和对象 -> 将其保存到主上下文 -> 将这些更改发送到服务器 -> 从服务器接收更新的更改 -> 更新编辑上下文

我用

context.automaticallyMergesChangesFromParent = true

但我也尝试过手动合并。

@objc private func contextSave(_ notification: Notification) {
let updated = (notification.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>)?
.filter { $0 as? Order != nil }
.map { $0 as! Order }

updated?.forEach { order in
Logger.shared.log("UPDATED FROM NOTIFICATION \n\n----\n\(order.objectID) \(order)\n-----\n\n")
}

localManagedContext.performAndWait {
let orders = self.fetchInChildContext()
orders.forEach {
Logger.shared.log("LOCAL AFTER NOTIFICATION \n\n----\n\($0.objectID) \($0)\n-----\n\n")
}
}
}

结果:我在编辑上下文中创建并从同步过程中更新的对象即使在主上下文中更新并且在 NSUpdatedObjects 集中也不会更新。

所有其他对象都正确合并。当对象从主上下文中获取时(而不是在子队列中创建)。

这是Edit Context里面的对象

Optional(<BestatterprogrammI.Order: 0x600003f05720> (entity: Order; id: 0x600001cbefc0 <x-coredata:///Order/tBADA027E-D83F-4E34-A741-2EACD7877EE82> ; data: {

这是我在 NSUpdatedObjects 中接收的对象

0xa8dc7e0d815e4391 <x-coredata://57464ABC-24B6-4E34-A992-3B2886E13686/Order/p2361> <BestatterprogrammI.Order: 0x600003ffec10> (entity: Order; id: 0xa8dc7e0d815e4391 <x-coredata://57464ABC-24B6-4E34-A992-3B2886E13686/Order/p2361> ; data: {

我正在相应地保存编辑上下文和同步上下文: //编辑上下文(主队列) localManagedContext.performAndWait { self.repopulateEntitiesID()

        do {
if self.localManagedContext.hasChanges {
try self.localManagedContext.save()

if saveParent {
// using .parent on context results
// in unexpected behaviour on iOS 10
try CoreDataHandler.shared.persistentContainer.viewContext.save()
}

callback(.valid)
} else {
callback(.valid)
}
}


// SYNC context (private queue)
if context.hasChanges {
do {
try context.save()
} catch let error {
Logger.shared.logConsole(error)
}
CoreDataHandler.shared.persistentContainer.viewContext.performAndWait {
if CoreDataHandler.shared.persistentContainer.viewContext.hasChanges {
do {
try CoreDataHandler.shared.persistentContainer.viewContext.save()
self.onSyncEventRaised.forEach { $0.value() }
} catch let error {
Logger.shared.logConsole(error)
}
}
}
}

请指出错误以及如何使上下文保持最新(不更改上下文)。

刷新对象会导致意外行为,这些对象在上下文中重复。

我想要的是在 Edit Context 中更新创建的对象并允许用户进一步编辑它。提前致谢。

更新:创建同步上下文(临时):

 let syncContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
syncContext.parent = CoreDataHandler.shared.persistentContainer.viewContext
syncContext.perform {

创建编辑上下文(持久的):

let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
context.parent = CoreDataHandler.shared.persistentContainer.viewContext
context.retainsRegisteredObjects = true
context.automaticallyMergesChangesFromParent = true

最佳答案

受以下影响:Core Data: Do child contexts ever get permanent objectIDs for newly inserted objects?

同样的问题出现在这里:Core Data merge two Managed Object Context

基本上我所拥有的 - 在编辑上下文中创建的对象有一个临时 ID,但在主上下文中的对象有一个永久 ID。

所以 Core Data 认为这是两个不同的对象,所以不会合并。解决方案 - 在保存之前为插入的对象提供永久 ID。

 localManagedContext.performAndWait {
self.repopulateEntitiesID()

do {
if self.localManagedContext.hasChanges {
// all inserted objects must get permanent ID to be updated
// from other contexts before fetching it from persistent store directly

let insertedObjects = Array(self.localManagedContext.insertedObjects)
try self.localManagedContext.obtainPermanentIDs(for: insertedObjects)
try self.localManagedContext.save()

if saveParent {
try CoreDataHandler.shared.persistentContainer.viewContext.save()
}

callback(.valid)
} else {
callback(.valid)
}
}
catch let error {
Logger.shared.logConsole(error)
callback(.error)
}
}

关于ios - 核心数据上下文合并(在子上下文中创建的对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54901216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com