SwiftUI + CoreData:插入 1000 多个具有关系的实体

SwiftUI + CoreData: Insert more than 1000 entities with relationships

我有一个 SwiftUI 项目,我在其中使用 CoreData 将从 API 获取的数据保存到设备中。我试图分批插入实体,但效果很好,直到我意识到分批插入时的关系“未受影响”:

我现在正在做的是在后台任务中手动插入实体:

container.performBackgroundTask { context in
            for job in jobs {
                let jobToInsert = Job(context: context)
                let type = JobType(context: context)
                let category = Category(context: context)
                
                jobToInsert.id = Int32(job.id)
                ....
                do {
                    print("Inserting jobs")
                    try context.save()
                } catch {
                    // log any errors
                }
}

有没有什么方法可以通过我不知道的方式来提高性能?因为对于用户来说,当他们启动应用程序时,一个一个地插入作业并不是一个很好的体验,因为首先,这需要很长时间(超过 2 分钟),其次,因为我的 UI 不是在我插入实体时自动更新。

非常感谢!

编辑:我还看到内存在增加,截取屏幕截图后和停止进程之前,我看到内存为 1.09 GB

编辑 2:这是我在尝试批量插入作业时使用的代码:

private func newBatchInsertRequest(with jobs: [JobCodable]) -> NSBatchInsertRequest {
        var index = 0
        let total = jobs.count
        let batchInsert = NSBatchInsertRequest(
            entity: Job.entity()) { (managedObject: NSManagedObject) -> Bool in
                guard index < total else { return true }
                if let job = managedObject as? Job {
                    let type = JobType(context: self.container.viewContext)
                    let category = Category(context: self.container.viewContext)
                    let data: JobCodable = jobs[index]
                    job.id = Int32(data.id)
...
return batchInsert

很遗憾,可能是上下文关系无法建立?因为我在 let category = Category(context: self.container.viewContext)

行中得到 Thread 13: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

您是否在插入的每个职位的上下文中调用 save()?如果是这样,我会从那里开始——如果你想一次加载一堆作业,你可以插入所有作业实例,设置关系,然后在最后(在循环)。

这不仅可以节省您的时间,还可以让您的 UI 看起来好像所有对象都同时出现。如果这不是您想要的,您可以尝试在循环中批量保存——例如,每千个 Job 对象只调用 save()