Ios 使用NSBatchInsertRequest的CoreData

Ios 使用NSBatchInsertRequest的CoreData,ios,swift,xcode,core-data,nspersistentcloudkitcontainer,Ios,Swift,Xcode,Core Data,Nspersistentcloudkitcontainer,我正试图使用NSBatchInsertRequest根据WWDC 2019()在CoreData中插入字典数组。insertResult为零,我的CoreData为空 let modelURL = Bundle.main.url(forResource: "CoreDataPerformance", withExtension: "momd")! let model = NSManagedObjectModel(contentsOf: modelURL)! let container = NSP

我正试图使用
NSBatchInsertRequest
根据WWDC 2019()在
CoreData
中插入字典数组。insertResult为零,我的CoreData为空

let modelURL = Bundle.main.url(forResource: "CoreDataPerformance", withExtension: "momd")!
let model = NSManagedObjectModel(contentsOf: modelURL)!
let container = NSPersistentCloudKitContainer(name: "CoreDataPerformance", managedObjectModel: model)
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
    if let error = error as NSError? {
        fatalError("Unresolved error \(error), \(error.userInfo)")
    }
})

try container.viewContext.setQueryGenerationFrom(.current)

let moc = container.viewContext
moc.automaticallyMergesChangesFromParent = true
moc.perform {
    let insertRequest = NSBatchInsertRequest(entity: Client.entity(), objects: clients)
    let insertResult = try? moc.execute(insertRequest) as? NSBatchInsertRequest
    let success = insertResult?.resultType
    print("RESULT STATUS: \(success)")
}
这是我在控制台中收到的错误:

2020-02-04 18:30:25.800705+0200 CoreDataPerformance[62836:778869] [error] warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'CoreDataPerformance.Client' so +entity is unable to disambiguate.

CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'CoreDataPerformance.Client' so +entity is unable to disambiguate.

2020-02-04 18:30:25.800846+0200 CoreDataPerformance[62836:778869] [error] warning:   'Client' (0x600000c50bb0) from NSManagedObjectModel (0x600001877480) claims 'CoreDataPerformance.Client'.

CoreData: warning:   'Client' (0x600000c50bb0) from NSManagedObjectModel (0x600001877480) claims 'CoreDataPerformance.Client'.

2020-02-04 18:30:25.800940+0200 CoreDataPerformance[62836:778869] [error] warning:   'Client' (0x600000c589a0) from NSManagedObjectModel (0x600001861680) claims 'CoreDataPerformance.Client'.

CoreData: warning:   'Client' (0x600000c589a0) from NSManagedObjectModel (0x600001861680) claims 'CoreDataPerformance.Client'.

我认为WWDC的谈话有错误。尝试这样做:

let insertRequest = NSBatchInsertRequest(entity: Client.entity(), objects: clients)
try! moc.execute(insertRequest)
try! moc.save()

我用试试看这样我就可以看到任何错误。您可以更改它

您的行
let insertResult=try?主运行中心执行(插入请求)为?NSBatchInsertRequest

应该是:
let insertResult=try?主运行中心执行(插入请求)为?NSBatchInsertResult

消除歧义的问题是因为在应用程序运行时,有多个核心数据堆栈处于打开状态。这是因为你有你的应用程序和测试堆栈吗?或者因为您的应用程序正在使用多个?

错误
CoreData:警告:多个NSEntityDescriptions声明NSManagedObject子类“CoreDataPerformance.Client”so+实体无法消除歧义。
表示您的模型中有多个实体使用
客户端
NSManagedObject
子类,应该只有一个


代码的另一个问题是,来自父级的
automaticallyMergesChangesFromParent
无法处理批处理请求,因为未生成did save通知。您必须使用
NSPersistentStoreRemoteChangeNotification
NSPersistentHistoryChangeRequest
mergeChangesFromContextDidSaveNotification
该技术在@21:57

调用
moc的四行中进行了说明。执行
。。。您是否尝试在不嵌入此执行闭包的情况下运行这些操作?即删除对
perform
的调用?NSBatchInsertRequest将对象保存到持久存储中。我认为您不需要显式地保存上下文。