Kerndaten: Muss ein Abruf eine Reise zu einem dauerhaften Speicher unternehmen?

Sagen wir, ich mache das:

NSManagedObjectContext *context = #a managed object context";
NSString *entityName = #an entity name#;
NSFetchRequest *requestForAll = [NSFetchRequest requestWithEntityName:entityName];
NSArray *allObj = [context executeFetchRequest:requestForAll];

for (NSString *name in allNamesArray){
    NSFetchRequest *requestForOne = [NSFetchRequest requestWithEntityName:entityName];
    requestForOne.predicate = [NSPredicate predicateWithFormat:@"name == %@",name];
    NSArray *ObjsWithName = [context executeFetchRequest:requestForOne];
    #do some work with the obj#
}

Führt der Abruf in der Schleife jedes Mal zu einer Reise zum permanenten Speicher? Oder werden diese Abrufe nur im Zeilen-Cache von coredata ausgeführt?

BEARBEITEN Ich habe ein Fragment des Testcodes geschrieben: Sie müssen eine Hauptdatenentität mit dem Namen "Person" erstellen und sie sollte ein Attribut mit dem Namen "name" vom Typ string haben.

Verwenden Sie diesen Code, um einige Daten zu füllen:

self.array = @[@"alkjsdfkllaksjdf",@"asldjflkajdklsfjlk;aj",@"aflakjsdl;kfjalksdjfklajkldhkl;aj",@"aljdfkljalksdjfl;j" ,@"flajdl;kfjaklsdjflk;j",@"akldsjfklajdslkf",@"alkdjfkljaklsdjflkaj",@"alsdjflkajsdflj",@"adlkfjlkajsdfkljkla",@"alkdjfklajslkdfj"];

NSString *firstRunKey = @"oh its first run!";
NSString *firstRun = [[NSUserDefaults standardUserDefaults] objectForKey:firstRunKey];
if (!firstRun) {
    for (NSString *name in self.array) {
        Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
        p.name = name;
    }
}
[self.managedObjectContext save];
[[NSUserDefaults standardUserDefaults] setObject:firstRunKey forKey:firstRunKey];
[[NSUserDefaults standardUserDefaults] synchronize];

Wenn Sie diese beiden Methoden verwenden, kostet die Verwendung von CoreData viel mehr Zeit als die Verwendung von FilterArray!

static int caseCount = 1000;
-(void)usingCoreData
{
    NSLog(@"core data");
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    NSArray *allPersons = [self.managedObjectContext executeFetchRequest:request error:nil];

    for (int i = 0; i < caseCount; i++){
        for (NSString *name in self.array) {
            request.predicate = [NSPredicate predicateWithFormat:@"name == %@",name];
            NSArray *result = [self.managedObjectContext executeFetchRequest:request error:nil];
        }
    }
}

-(void)usingFilterArray
{
    NSLog(@"filter array");
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    NSArray *allPersons = [self.managedObjectContext executeFetchRequest:request error:nil];

    for (int i = 0; i < caseCount; i++){
        for (NSString *name in self.array) {
            NSArray *array = [allPersons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name == %@",name]];
        }
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage