Tengo un proyecto SwiftUI en el que estoy usando CoreData para guardar datos obtenidos de una API en el dispositivo. Estaba tratando de insertar las entidades en lotes que funcionaron bien hasta que me di cuenta de que las relaciones cuando se insertan en lotes están "intactas":
Job , que tiene una relación de uno a muchos con la entidad Tag.Category .Type .Lo que estoy haciendo ahora es insertar las entidades manualmente en una tarea en segundo plano:
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 } }¿Hay alguna forma de mejorar el rendimiento tal vez haciendo esto de una manera que no conozco? Porque para el usuario, cuando inicia la aplicación, insertar los trabajos uno por uno no es una experiencia muy agradable porque primero, lleva mucho tiempo (más de 2 minutos) y segundo porque mi UI no se actualiza automáticamente como yo Estoy insertando las entidades.
¡Muchas gracias por adelantado!
EDITAR: También veo que aumenta la memoria y después de tomar la captura de pantalla y antes de detener el proceso, vi la memoria en 1.09 GB
EDIT 2: Este es el código que usé al intentar insertar los trabajos por lotes:
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 Desafortunadamente, la relación no se puede construir debido probablemente al contexto. ya que obtengo el Thread 13: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) en la línea let category = Category(context: self.container.viewContext)
¿Está llamando a save() en el contexto de cada trabajo que inserta? Si es así, comenzaría allí: si desea cargar un montón de trabajos a la vez, puede insertar todas sus instancias de trabajo, configurar las relaciones y luego solo save() una vez al final (fuera del ciclo) .
Esto no solo le ahorrará tiempo, sino que también hará que parezca que todos los objetos aparecen al mismo tiempo en su interfaz de usuario. Si eso no es lo que desea, puede experimentar guardando en lotes dentro del ciclo; por ejemplo, solo llame a save() cada mil objetos Job.