Swift 如何处理核心数据的并发性

Swift 如何处理核心数据的并发性,swift,xcode,core-data,concurrency,Swift,Xcode,Core Data,Concurrency,我一直在谷歌、stackoverflow和互联网上徘徊,试图了解如何处理核心数据和并发性 假设我们有两张桌子、活动和房间。 一个活动可以有1个以上的房间 函数加法器 功能B-添加室 FunctionC-SearchRoom->返回RoomEntity或nil 我的问题是,我一直在犯这些错误 Error Domain=NSCocoaErrorDomain Code=133020 "Could not merge changes." UserInfo={conflictList=( "NSM

我一直在谷歌、stackoverflow和互联网上徘徊,试图了解如何处理核心数据和并发性

假设我们有两张桌子、活动和房间。 一个活动可以有1个以上的房间

函数加法器

功能B-添加室

FunctionC-SearchRoom->返回RoomEntity或nil

我的问题是,我一直在犯这些错误

Error Domain=NSCocoaErrorDomain Code=133020 "Could not merge changes." UserInfo={conflictList=(
    "NSMergeConflict (0x10a507160) for NSManagedObject (0x1092f00c0) with objectID '0xd000000000040000 <x-coredata://A34C65BD-F9F0-4CCC-A9FB-1B1F5E48C70E/Rooms/p1>' with oldVersion = 116 and newVersion = 124 and old object snapshot = {\n    location = Lisboa;\n    name = \"\\U00cdndico LX\";\n} and new cached row = {\n    location = Lisboa;\n    name = \"\\U00cdndico LX\";\n}"
三,-

4-对于每个事件,我执行相同的函数来创建数据并将其保存在数据库中(managedObjectContext.insert(eventEntity))。这将在几个表上工作,但只考虑事件和房间(函数B)。 5-FunctionA包含functionB。函数B搜索现有文件室(函数C->返回实体?),如果不存在(无),则创建实体(是否保存在此处?)

6-如果存在文件室,则获取实体并尝试更新数据

不确定这是否有什么不同,但当我保存时,我会在dispatchGroup之间进行这些保存

DatabaseDispatchGroup.enter()
try managedObjectContext.save()
DatabaseDispatchGroup.leave()
我使用的是一个用于所有数据库请求的静态managedObjectContext,但现在我决定为访问数据库的每个函数创建一个objectContext

我为所有请求保留相同的persistentContainer和相同的DispatchGroup

private override init() {
persistentContainer = NSPersistentContainer(name: "DataModel")

        persistentContainer.loadPersistentStores() { (description, error) in
            if let error = error {
                fatalError("Failed to load Core Data stack: \(error)")
            }

        }
}
在我看来,我的问题在于我将更改存储在内存中,并且总是对初始数据进行更新,这意味着当我执行save()上下文时,数据不会在下一个操作中更新

如何/何时执行保存功能


谢谢

保存上下文后,将发布全局通知:ContextDidSave notification

当使用多个上下文(而不是使用父子方法)时,您应该使用此通知,并且:

  • 重新获取/刷新数据,以防需要更新视图或对新数据集执行某些操作(使用获取请求或刷新对象:API)
  • 将更改合并到其他上下文(记住线程限制!仅在适当的上下文队列上执行此操作)
有很多关于它的文章,比如check
您可以在核心数据中使用父子模式进行并发。我的第一种方法是使用静态MOC,但它不起作用,我仍然有并发问题。我认为这是因为我把DispatchGroup和.perform混合在一起(我认为他们有相同的目标)。因此,如果我使用带有.perform的静态MOC,它应该正常工作?我的想法是使用dispatchGroup来防止同时出现多个请求:P我错了
DatabaseDispatchGroup.enter()
try managedObjectContext.save()
DatabaseDispatchGroup.leave()
private override init() {
persistentContainer = NSPersistentContainer(name: "DataModel")

        persistentContainer.loadPersistentStores() { (description, error) in
            if let error = error {
                fatalError("Failed to load Core Data stack: \(error)")
            }

        }
}