2012-04-12 11 views
0

Meine Anwendung verfügt über einen UITableViewController, der eine Liste von Zellen enthält, die Namen von Städten darstellen. Wenn ein Benutzer auf eine Zelle klickt, ändert die Anwendung die Zelle accessoryType in UITableViewCellAccessoryCheckmark und speichert den Textwert der Zelle (Name der Stadt) im permanenten Speicher. Ich habe jedoch festgestellt, dass jedes Mal, wenn ich auf die Zelle klicke, mindestens 10 Sekunden benötigt werden, um die Daten tatsächlich im Persistent Store zu speichern. Irgendeine Idee, warum das passiert? Anstatt die Daten sofort zu speichern, warum dauert es so lange, bis sie bestehen bleiben?NSManagedContext dauert sehr lange, um persistent zu bleiben

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cityName = [self.citySettingModel nameOfCityAtIndex:indexPath.row OfCountryAtIndex:self.countryIndex];  
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     [[self.citySettingModel worldbikesCoreService] removeCity:cityName]; 
    } 
    else { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     [[self.citySettingModel worldbikesCoreService] addCity:cityName toCountry:self.countryName]; 
    } 
} 

Der Code für eine Stadt zu schaffen und Land-Objekte sind in einer anderen Klasse

- (City *) addCity:(NSString*) cityName toCountry:(NSString*) countryName 
{ 
    NSManagedObjectContext *context = [self.delegate managedObjectContext]; 

    Country *country = [self.countryDAO addCountry:countryName inManagedObjectContext:context]; 

    City *city = [self.cityDAO addCity:cityName inManagedObjectContext:context]; 

    [country addCitiesObject:city]; 
    return city; 
} 

- (City*) addCity:(NSString*) cityName inManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"City"]; 
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"cityName = %@", cityName]; 
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"cityName" ascending:YES]; 
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    NSError *error; 
    NSArray *matches = [context executeFetchRequest:fetchRequest error:&error]; 

    if (error) NSLog(@"error when retrieving city entities %@", error); 

    City *city; 

    if (!matches || [matches count] > 1) ; 
    else if ([matches count] == 0) { 
     city = [NSEntityDescription insertNewObjectForEntityForName:@"City" inManagedObjectContext:context]; 
     city.cityName = cityName; 
    } 
    else city = [matches lastObject]; 

    return city; 
} 
+0

Erstens: wo speichern Sie den Kontext in den Code oben? Ich sehe keine Rettung hier. Zweitens: Denkst du nicht, dass deine Anfrage in addCity: ... für diese 10 Sekunden verantwortlich sein könnte ...? – codeclash

Antwort

1

Die wirklich gute Möglichkeit, um herauszufinden, was in Xcode so lange Zeit ist Einnahme ist Zeit Profiler - es sollte sein, Ihre bester Freund in iOS App Entwicklung.

In Xcode anstelle von Run sollten Sie auf Test tippen, dort wählen Sie Time Profiler. Sie können sehen, wie viel Zeit ein Prozess braucht.

Es gibt auch einige Tools, mit denen Sie Core Data Fets untersuchen können.

Schauen Sie, was die meiste Zeit dort dauert und aktualisieren Sie die Post. Oder, vielleicht, Sie können es selbst lösen dann)

Verwandte Themen