Actualiser NSFetchedResultsController de données?

Je peux créer de nouveaux objets gérés à l'intérieur de mon application, dans une vue séparée j'ai une vue de la table qui contient tous les objets que j'ai.

Lorsque je crée un nouvel objet géré (en séparer totalement de la vue), je suis l'envoi d'une notification qui est d'essayer d'obtenir mon tableau vue de recharger avec les nouvelles données qui comprend le nouvel objet que je viens de faire.

Je ne suis pas d'édition de l'affichage de la table.

Il y a un seul contexte de la gestion.

Je ne peux pas comprendre ce que je fais de mal. Si je ferme l'application et de la relancer mon nouvel objet est dans la vue de table. Je suis en train d'appel reloadData quand je reçois la notification d'un nouvel objet a été faite, et j'ai aussi essayé d'effectuer l'extraction de nouveau, mais tout ce que je finissez avec est un tableau vide à vue.

En termes de code, mon ListViewController:

@interface MyNotesViewController : UIViewController
{
    NSManagedObjectContext * __managedObjectContext;
    UITableView * _notesTableView;
    MyNotesTableViewDelegate_DataSource * _tableDelegate_DataSource;
}

Mon viewDidLoad ressemble à ceci:

- (void)viewDidLoad
{
    [super viewDidLoad];

    _tableDelegate_DataSource = [[MyNotesTableViewDelegate_DataSource alloc] init];
    _tableDelegate_DataSource.managedObjectContext = __managedObjectContext;
    [_notesTableView setDataSource:_tableDelegate_DataSource];

    NSError * _coreDataError;
    BOOL success = [[_tableDelegate_DataSource fetchedResultsController] performFetch:&_coreDataError];

    if(success){
        [_notesTableView reloadData];
    }
}

Dans mon délégué/objet source de données que j'ai:

@interface MyCommutesTableViewDelegate_DataSource : NSObject 

<UITableViewDataSource, NSFetchedResultsControllerDelegate>
{
    NSManagedObjectContext * __managedObjectContext;
    NSFetchedResultsController * __fetchedResultsController;
}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end

Mise en œuvre de l'extrait:

-(NSFetchedResultsController*)fetchedResultsController{
    if(!__fetchedResultsController){
        NSFetchRequest * request = [[NSFetchRequest alloc] init];
        [request setEntity:[NSEntityDescription entityForName:@"Note" inManagedObjectContext:__managedObjectContext]];

        [request setFetchBatchSize:10];

        NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
        [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
        [sortDescriptor release];

        __fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:__managedObjectContext sectionNameKeyPath:nil cacheName:nil];


        __fetchedResultsController.delegate = self;
        [request release];

    }
    return __fetchedResultsController;
}

J'ai le stander UITableView source de données méthodes ici:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    id <NSFetchedResultsSectionInfo> sectionInfo = 
    [[__fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"NotesTableViewCell";

    NotesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {        
        NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NotesTableViewCell" owner:nil options:nil];
        for(id currentObject in topLevelObjects){
            if([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (NotesTableViewCell*) currentObject;
                break;
            }
        }

    }

//Configure the cell.
    Note * _note = [__fetchedResultsController objectAtIndexPath:indexPath];

    [...]

    return cell;
}

Mise à JOUR

Je revenue simplement de demander à tous les objets, car j'ai dû rapide pour résoudre mon problème, et puis j'ai réalisé, après que j'ai enregistrer mon égard, ma demande de récupération j'avais déjà utilisé sur du lancement de l'application, maintenant retourne pas de données, il n'y a pas d'erreur, mais il ne renvoie rien.

Donc je suppose qu'il n'y a pas de problème avec la façon dont je suis la mise en œuvre de NSFetchResultsController. Mais comment peut-il le début de la demande de ne pas retourner les résultats après je enregistrer un nouvel objet ?

Remarque, je reçois toujours tous mes objets si je relance, y compris le nouvellement ajouté.

dossier type de demande:

-(NSArray*)getNotes{
    NSFetchRequest * request = [[NSFetchRequest alloc] init];

    NSEntityDescription * entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:[self managedObjectContext]];
    [request setEntity:entity];

    NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release];

    NSError * coreDataError;
    NSArray * fetchedObjects = [[self managedObjectContext] executeFetchRequest:request error:&coreDataError];
    [request release];

    if(fetchedObjects != nil){
        return fetchedObjects;
    } else {
        NSLog(@"ERR: %@", coreDataError);
        return nil;
    }
}

Je suis en attente d'une notification m'indiquant un nouvel objet a été ajouté à la Base de Données, et puis je vais appeler la méthode ci-dessus, puis en appelant reloadData sur mon tableview...

OriginalL'auteur Daniel | 2011-10-20