Cómo acelerar la inserción de un nuevo object en una entidad con datos básicos

Aquí está mi código, que está tomando algunos datos de JSON e insertándolo en la entidad de la sala de datos del núcleo:

for (NSDictionary *room in rooms) { NSDictionary *thisroom = [room objectForKey:@"room"]; NSString *roomidstring = [thisroom objectForKey:@"roomid"]; int roomid = [roomidstring intValue]; NSString *roomname = [thisroom objectForKey:@"roomname"]; NSString *buildingidstring = [thisroom objectForKey:@"buildingid"]; int buildingid = [buildingidstring intValue]; // import into database NSManagedObject *roomInfo = [NSEntityDescription insertNewObjectForEntityForName:@"room" inManagedObjectContext:context]; [roomInfo setValue:[NSNumber numberWithInteger:roomid] forKey:@"roomid"]; [roomInfo setValue:roomname forKey:@"roomname"]; [roomInfo setValue:[NSNumber numberWithInteger:buildingid] forKey:@"buildingid"]; if (![context save:&error]) { NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); } } 

Es increíblemente lento al insert alnetworkingedor de 900 objects. ¿Hay alguna manera de hacerlo más eficiente y / o acelerarla?

¡Gracias!

Sí, NO guarde hasta que termine el ciclo o guarde en lotes si la memory es un problema. La operación de save es muy costosa, por lo que debe evitar savelos con frecuencia en loops ajustados como este.

 for (NSDictionary *room in rooms) { NSDictionary *thisroom = [room objectForKey:@"room"]; NSString *roomidstring = [thisroom objectForKey:@"roomid"]; int roomid = [roomidstring intValue]; NSString *roomname = [thisroom objectForKey:@"roomname"]; NSString *buildingidstring = [thisroom objectForKey:@"buildingid"]; int buildingid = [buildingidstring intValue]; // import into database NSManagedObject *roomInfo = [NSEntityDescription insertNewObjectForEntityForName:@"room" inManagedObjectContext:context]; [roomInfo setValue:[NSNumber numberWithInteger:roomid] forKey:@"roomid"]; [roomInfo setValue:roomname forKey:@"roomname"]; [roomInfo setValue:[NSNumber numberWithInteger:buildingid] forKey:@"buildingid"]; } if (![context save:&error]) { NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); } 

¿Qué hay de mover la llamada [save context] fuera del ciclo y save todos ellos en una sola operación? Parece que hacer una partida cada vez haría las cosas mucho más lentas.

Importe una vez, copie el file de almacenamiento en el directory de documentos, actualice el código de coordinador de almacén persistente para cargar dicho file desde una nueva location.

Además (para la respuesta de Joe), también puede acelerar el time de ahorro al save en otro hilo (NSPrivateQueueConcurrencyType):

 - (void)openDataBase { // Set up _persistentStoreCoordinator accordingly. privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [privateWriterContext setPersistentStoreCoordinator:_persistentStoreCoordinator]; context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; context.parentContext = _privateWriterContext; } - (void)save { [context performBlock:^{ NSError *error; if (![context save:&error]) { // This will forward save to the parent, which is privateWriterContext. NSLog(@"Error saving main DB: %@, %@", error, [error userInfo]); NSAssert(false, nil); } [privateWriterContext performBlock:^{ NSError *error; if (![privateWriterContext save:&error]) { NSLog(@"Error saving writer DB: %@, %@", error, [error userInfo]); NSAssert(false, nil); } }]; }]; }