3 Stimmen

NSFetchedResultsControllerDelegate-Methoden werden nicht aufgerufen, wenn das Prädikat IN?

Ich implementiere einen UITableViewController in Verbindung mit NSFetchedResultsController. Wenn der UITableViewController instanziiert wird, wird der NSFetchedResultsController konstruiert (im Wesentlichen auf die gleiche Weise wie CoreDataBooks Beispiel) mit einem anderen Prädikat, basierend auf der Auswahl, die der Benutzer am vorherigen Controller getroffen hat.
Manchmal setze ich das Prädikat auf diese Weise:

predicate = [NSPredicate predicateWithFormat:@"container = %@", aManagedObject];

manchmal auf diese Art und Weise:

predicate = [NSPredicate predicateWithFormat:@"container IN (%@)", aNSMutableSetOfObjectsID];

Beide Prädikate funktionieren gut, weil sie korrekt alle meine Objekte wie erwartet abrufen. Das Problem tritt auf, wenn ich versuche, ein neues verwaltetes Objekt in die Liste einzufügen, wenn das zweite Prädikat gesetzt ist. Tatsächlich werden in diesem Fall die FRC-Delegate-Methoden nie aufgerufen, so dass der Tableview nicht automatisch aktualisiert wird.
Ich bin mir sicher, dass das neue Objekt korrekt zum gleichen Kontext hinzugefügt wird, der von der FRC verwendet wird, und dass seine "Container"-Beziehung so eingestellt ist, dass der Delegat ausgelöst werden sollte, aber das tut er nicht!

Was ich ausprobiert habe:

Ich sage, dass das zweite Prädikat funktioniert gut, weil, wenn ich ein neues Objekt hinzufügen und dann Pop die UITableViewController und schieben Sie es wieder, zwingen alle Daten zurückgerufen werden, das neue Objekt in der Liste ohne Problem angezeigt.
Ein weiterer Test, den ich durchgeführt habe, besteht darin, die FRC sofort nach dem Hinzufügen eines neuen Objekts neu berechnen zu lassen:

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
    exit(-1);
}
[self.tableView reloadData];

wird das neue Objekt korrekt angezeigt.

Código:

- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController == nil) {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *managedObjectContext = realEstate.managedObjectContext;

    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectContext]];       
    [fetchRequest setPredicate:[self getBasePredicate]];

    NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                                                                   ascending:YES 
                                                                    selector:@selector(localizedCaseInsensitiveCompare:)];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:nameDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [nameDescriptor release];
    [sortDescriptors release];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                                                managedObjectContext:managedObjectContext 
                                                                                                  sectionNameKeyPath:@"sectionIndex" 
                                                                                                           cacheName:nil];
    self.fetchedResultsController = aFetchedResultsController;
    fetchedResultsController.delegate = self;
    [aFetchedResultsController release];
    [fetchRequest release];
}

return fetchedResultsController;
}

// return a predicate for the fetchedResultsController
- (NSPredicate *)getBasePredicate {
    NSPredicate *predicate = nil;

    if ([[managedObject valueForKey:@"subcontainersCount"] intValue] == 0)
        // container without sons   **(FIRST PREDICATE)**
        predicate = [NSPredicate predicateWithFormat:@"container = %@", managedObject];
    else {
        // container with sons    **(SECOND PREDICATE)**
        predicate = [NSPredicate predicateWithFormat:@"container IN (%@)", [Container allDescendantsObjectID:(Container *)managedObject includeSource:YES]];
    }

    return predicate;
}

- (void)addNewItem {
    Item *newItem = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" 
                                                          inManagedObjectContext:realEstate.managedObjectContext];
    newItem.name = @"my new item";
    newItem.container = aContainerManagedObject;

    NSError *error = nil;
    if (![realEstate.managedObjectContext save:&error]) {
        abort();
    }
}

Die NSFetchedResultsControllerDelegate-Methoden, die ich verwende, stammen aus dem "More iPhone 3 Development". Der komplette Code kann hier eingesehen werden aquí (Seiten 30-31, 35).
Bei Bedarf kann ich hier posten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X