Sto lavorando a un'applicazione per iPhone che ottiene un numero di oggetti da un database. Mi piacerebbe archiviarli usando Core Data, ma ho problemi con le mie relazioni.Aggiunta di oggetti unici a Core Data
Un Dettaglio contiene un numero qualsiasi di POI (punti di interesse). Quando prelevo un set di POI dal server, contengono un ID di dettaglio. Per associare il POI al dettaglio (per ID), il mio processo è il seguente: Interrogare ManagedObjectContext per detailID. Se quel dettaglio esiste, aggiungete il poi a esso. In caso contrario, crea il dettaglio (ha altre proprietà che verranno popolate pigramente).
Il problema con questo è prestazioni. L'esecuzione di query costanti su Core Data è lenta, al punto che aggiungere un elenco di 150 POI richiede un minuto grazie alle molteplici relazioni coinvolte.
Nel mio vecchio modello, prima di Core Data (vari oggetti di cache NSDictionary) questo processo è stato super veloce (cercare una chiave in un dizionario, quindi crearlo se non esiste)
ho più rapporti rispetto a questo, ma praticamente ognuno deve fare questo controllo (alcuni sono molti per molti, e hanno un vero problema).
Qualcuno ha qualche suggerimento su come posso aiutare questo? Potrei eseguire meno query (cercando un numero di ID diversi), ma non sono sicuro di quanto questo possa essere d'aiuto.
Alcuni codice:
POI *poi = [NSEntityDescription
insertNewObjectForEntityForName:@"POI"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
poi.POIid = [attributeDict objectForKey:kAttributeID];
poi.detailId = [attributeDict objectForKey:kAttributeDetailID];
Detail *detail = [self findDetailForID:poi.POIid];
if(detail == nil)
{
detail = [NSEntityDescription
insertNewObjectForEntityForName:@"Detail"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
detail.title = poi.POIid;
detail.subtitle = @"";
detail.detailType = [attributeDict objectForKey:kAttributeType];
}
-(Detail*)findDetailForID:(NSString*)detailID {
NSManagedObjectContext *moc = [[UIApplication sharedApplication].delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"Detail" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"detailid == %@", detailID];
[request setPredicate:predicate];
NSLog(@"%@", [predicate description]);
NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil || [array count] != 1)
{
// Deal with error...
return nil;
}
return [array objectAtIndex:0];
}
Spiega i tuoi oggetti in modo più dettagliato e pubblica parte del codice che usi. È quasi del 100% probabile che ci sia un modo per fare ciò che stai già facendo molto più velocemente. – Sneakyness