In ogni caso, non salvare dopo aver inserito ogni oggetto o essere preparati per prestazioni spaventose.
Ecco il codice che utilizzo per popolare un repository Core Data al primo avvio.
#define MAX_UNSAVED_AIRPORTS_BEFORE_SAVE 1000
int numAirports = 0;
int numUnsavedAirports = MAX_UNSAVED_AIRPORTS_BEFORE_SAVE; // *** bug. see below
for (NSDictionary *anAirport in initialAirports) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Airport *newAirport = [NSEntityDescription insertNewObjectForEntityForName:@"Airport" inManagedObjectContext:managedObjectContext];
newAirport.city = [anAirport objectForKey:@"city"];
newAirport.code = [anAirport objectForKey:@"code"];
newAirport.name = [anAirport objectForKey:@"name"];
newAirport.country_name = [anAirport objectForKey:@"country_name"];
newAirport.latitude = [NSNumber numberWithDouble:[[anAirport objectForKey:@"latitude"] doubleValue]];
newAirport.longitude = [NSNumber numberWithDouble:[[anAirport objectForKey:@"longitude"] doubleValue]];
newAirport.altitude = [NSNumber numberWithDouble:[[anAirport objectForKey:@"altitude"] doubleValue]];
numAirports++;
numUnsavedAirports++;
if (numUnsavedAirports >= MAX_UNSAVED_AIRPORTS_BEFORE_SAVE) {
if (![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
numUnsavedAirports = 0;
}
[pool release];
}
Inoltre, non dimenticare di salvare un'ultima volta dopo il ciclo.
essere consapevoli che esiste un errore che porterà ad un incidente, se tutte e tre le seguenti condizioni sono soddisfatte anche:
- il repository è vuoto
- Hai un UITableView con sezioni
- tuo prima salva salva più di un oggetto.
La soluzione nel codice sopra è per inizializzare il numUnsavedAirports
a MAX_UNSAVED_AIRPORTS_BEFORE_SAVE
al fine di assicurarsi che il primo salvataggio avviene dopo il primo inserto .
Spero che questo aiuti.
fonte
2010-04-10 01:03:21
Il salvataggio di ogni oggetto singolarmente produrrà prestazioni terribili. –