2010-08-18 6 views
5

in meiner App brauche ich Schleife durch alle meine Entitäten in Core Data und ich benutze NSFetchedresultcontroller.wie Schleife durch nfetchedresultcontroller

ich im Moment wie dieser es so mache:

NSArray *tempArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects]; 

for (MyClass *item in tempArray) 
{ 
    // do something 
} 

[tempArray release]; tempArray = nil; 

Gibt es einen besseren Weg, es zu tun, ohne die TempArray zu schaffen?

Vielen Dank

Antwort

11

Hängt davon ab, was Sie tun möchten. Wenn Sie nur einen Wert zu ändern, dann ja, es ist ein einfacher Weg:

[[[self fetchedResultsController] fetchedObjects] setValue:someValue forKey:@"someKey"] 

Welche würden Schleife durch alle Objekte den Wert einstellen. Dies ist eine Standard-KVC-Operation. Beachten Sie, dass dadurch der Speicher erweitert wird, da jede Entität während der Mutation realisiert wird.

Wenn Sie etwas viel mehr beteiligt mit jeder Entität tun müssen oder Sie in ein Speicherproblem geraten, dann wird die Dinge ein bisschen komplizierter. HINWEIS: Machen Sie sich keine Gedanken über Speicher bis zur Optimierungsphase des Codierens. Die Voroptimierung von Speicherproblemen, insbesondere mit Core-Daten, ist reine Zeitverschwendung.

Das Konzept besteht darin, dass Sie jede Entität durchlaufen und bei Bedarf ändern. Außerdem sollten Sie zu einem bestimmten Zeitpunkt den Kontext speichern, zurücksetzen und dann einen lokalen Autorelease-Pool leeren. Dies wird Ihre Speichernutzung reduzieren, wie Sie die Objekte schieben werden Sie nur aus der Erinnerung manipulieren zurück, bevor Sie die nächste Charge in Zum Beispiel ziehen.

NSManagedObjectContext *moc = ...; 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSInteger drainCounter = 0; 
for (id object in [[self fetchedResultsController] fetchedObjects]) { 
    //Do your magic here 
    ++drainCounter; 
    if (drainCounter = 100) { 
    BOOL success = [moc save:&error]; 
    NSError *error = nil; 
    NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]); 
    [moc reset]; 
    [pool drain], pool = nil; 
    pool = [[NSAutoreleasePool alloc] init]; 
    drainCounter = 0; 
    } 
} 

BOOL success = [moc save:&error]; 
NSError *error = nil; 
NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]); 
[pool drain], pool = nil; 

Dies wird unten Speichernutzung halten, aber es ist teuer! ! Sie treffen die Festplatte nach jeweils 100 Objekten. Dies sollte nur verwendet werden, nachdem Sie bestätigt haben, dass Speicher ein Problem ist.

6

Sorry, ich glaube, die Antwort liegt auf der Hand:

 for (MyClass *item in self.fetchedResultsController.fetchedObjects) 
     { 
      //do something 
     } 

Ist es ein guter Weg, es Speicher-weise zu tun?