¿Complemento de iOS CoreData por lotes?

En mi aplicación para iPhone, necesito insertar ~ 2000 registros en Core Data antes de que el usuario pueda usar cualquier característica de la aplicación. Estoy cargando los registros en CoreData desde un archivo JSON local. Este proceso lleva mucho tiempo (más de 2,5 minutos), pero solo debe suceder una vez (o cada aplicación de ~ 10 se abre para obtener datos actualizados).

¿Hay un inserto por lotes para Core Data? ¿Cómo puedo acelerar este proceso de inserción?

Si no puedo acelerarlo usando Core Data, ¿cuáles son las otras opciones recomendadas?

Consulte el capítulo Importar datos de manera eficiente de la Guía de progtwigción de datos básicos.

Actualmente estoy teniendo los mismos problemas que tú, solo estoy insertando 10000 objetos y tarda unos 30 segundos, lo que todavía es lento para mí. Estoy haciendo un [managedObjectContext save] en cada 1000 objetos administrados insertados en el contexto (en otras palabras, mi tamaño de lote es 1000). He experimentado con 30 tamaños diferentes de lotes (de 1 a 10000), y 1000 parece ser el valor óptimo en mi caso.

Estaba buscando la respuesta a una pregunta similar cuando me encontré con esta. La respuesta de @VladimirMitrovic fue útil en ese momento para saber que no debería guardar el contexto cada vez, pero también estaba buscando algún código de muestra.

Ahora que lo tengo, proporcionaré el código a continuación para que otras personas puedan ver cómo sería una inserción por lotes.

 // set up a managed object context just for the insert. This is in addition to the managed object context you may have in your App Delegate. let managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType) managedObjectContext.persistentStoreCoordinator = (UIApplication.sharedApplication().delegate as! AppDelegate).persistentStoreCoordinator // or wherever your coordinator is managedObjectContext.performBlock { // runs asynchronously while(true) { // loop through each batch of inserts. Your implementation may vary. autoreleasepool { // auto release objects after the batch save let array: Array? = getNextBatchOfObjects() // The MyManagedObject class is your entity class, probably named the same as MyEntity if array == nil { break } // there are no more objects to insert so stop looping through the batches // insert new entity object for item in array! { let newEntityObject = NSEntityDescription.insertNewObjectForEntityForName("MyEntity", inManagedObjectContext: managedObjectContext) as! MyManagedObject newObject.attribute1 = item.whatever newObject.attribute2 = item.whoever newObject.attribute3 = item.whenever } } // only save once per batch insert do { try managedObjectContext.save() } catch { print(error) } managedObjectContext.reset() } } 

C objective

Versión para @Suragch anwser

 NSManagedObjectContext * MOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; MOC.persistentStoreCoordinator = YOURDB.persistentStoreCoordinator; [MOC performBlock:^{ // DO YOUR OPERATION }];