2012-03-28 5 views
0

So habe ich den folgenden Code für alle meine Kerndatenelemente genannt EinstellungenfetchedResultsController Best Practices für Unternehmen mit Prädikat bekommen

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    /* 
    Set up the fetched results controller. 
    */ 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Setting" inManagedObjectContext:self.managedObjectContext_]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setReturnsObjectsAsFaults:NO]; 
    [fetchRequest setResultType:NSManagedObjectResultType]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"serviceName" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext_ sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController_ = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [fetchRequest release]; 

    return fetchedResultsController_; 
} 

Ich habe eine Eigenschaft NSFetchedResultsController *fetchedResultsController holen und ich habe es therough der App via:

[self.fetchedResultsController_ fetchedObjects] 

Die Frage ist, ich mit einer bestimmten Eigenschaft Einheiten abrufen möchten, das heißt: mit einem Prädikat:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"settingName", somesettingName]; 
     [fetchRequest setPredicate:predicate]; 

Die Frage ist, sollte ich eine neue fetchResultsControllerWithServiceName: (NSString *) serviceName erstellen oder sollte ich nur die vorhandene Methode verwenden? Was ist die beste Vorgehensweise dafür?

Antwort

1

Es ist sicherlich schneller (obwohl ich nicht sicher bin, wie viel schneller), einen vorhandenen Abrufanforderungscontroller zu ändern, anstatt ihn jedes Mal neu zu erstellen, wenn Ihr Prädikat aktualisiert werden muss. In der Dokumentation von Apple heißt es eindeutig: "Sie sollten keinen Cache verwenden, wenn Sie die Abrufanforderung ändern", aber da Sie derzeit kein Caching verwenden, ist dies kein Problem.

So, alles, was Sie tun müssen, um aktualisierte Ergebnisse zu erhalten, aktualisieren Sie das Prädikat, rufen Sie performFetch: auf dem abgerufenen Ergebniscontroller, und reagieren auf die Delegat-Rückrufe, die Sie erhalten.

Sie können es bequem finden, diese Reihe von Aufrufen in eine eigene Methode zu packen, aber Sie können sicherlich vermeiden, das gesamte Controller-Objekt neu zu generieren, wenn nur das Prädikat sich ändert.

+0

Also sagen Sie, um eine Methode zu erstellen, nur das Prädikat setzen und dann performFetch erneut aufrufen? – xonegirlz

+0

Ja, das sollte ausreichen. – warrenm

+0

Was ist, wenn ich nun die abgerufenenObjekte ohne das Prädikat-Set nach dem Aufruf dieser Funktion erhalten möchte? Ich müsste im Grunde das Prädikat (self.fetchedResultsController.fetchRequest setPredicate: nil) des NSFetchRequest rechts nach diesem Eintrag richtig? – xonegirlz