Evgeniy Kleban
Evgeniy Kleban

Reputation: 6975

Reload fetchedResultsController data

I have table view managed by fetched results controller. What i want is, to change sort order when user tap segmented control. This is how i create fetched results controller:

- (NSFetchedResultsController *)frc {

    if (_frc != nil) {
        return _frc;
    }

    NSString *sortCase;
    switch (self.sortOrder) {
        case tableSortServer:
            sortCase = [NSString stringWithFormat:@"%@", CD_SORT];
            break;

        case tableSortDate:
            sortCase = [NSString stringWithFormat:@"%@", CD_DATE];
            break;

        default:
            sortCase = [NSString stringWithFormat:@"%@", CD_SORT];
            break;
    }


    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:CD_ENTITY_NAME  inManagedObjectContext:self.getManagedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:sortCase ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:BATCH_SIZE];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:self.getManagedObjectContext sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    self.frc = theFetchedResultsController;
    _frc.delegate = self;

    return _frc;

}

In segmented controller callback method i did:

- (IBAction)sortOrderChanged:(id)sender {

    UISegmentedControl *sc = sender;
    if (sc.selectedSegmentIndex == 0){
        self.sortOrder = tableSortServer;
        [self.tableView reloadData];
    }    else {
        self.sortOrder = tableSortDate;
        [self.tableView reloadData];
    }

}

However, its not work. How to achieve that task? (reload table with different sort order)?

Upvotes: 0

Views: 184

Answers (1)

Andrey Chernukha
Andrey Chernukha

Reputation: 21808

Maybe this is because of

if (_frc != nil) {
    return _frc;
}

you reload the table. It uses the old fetch results controller. Your self.sortOrder = tableSortServer is therefore not taken into account. I think you need set new sort descriptor (and actually perform fetch) every time before reloading your table view

Upvotes: 1

Related Questions