coffeecoder
coffeecoder

Reputation: 634

Core Data: Do we need to re-fetch after every delete?

Hi Please could someone help me?

I am using core data with tableview controller. I am using an NSFetchedResultsController (NSFRC) and NSManagedObjectContext (NSMOC).

1) I am doing NSFRC.performFetch inside the view did load 2) When the user deletes a row I am doing NSMOC.deleteObject

App crashes, complaining that the number of rows didn't decrease after the delete

Doing a NSFRC.performFetch just after the delete solves it. But I thought it should work without us having to force a fetch? Please could someone explain this to me? I am using IOS 8 (beta 5) with Swift by the way

Upvotes: 0

Views: 115

Answers (1)

Sunny
Sunny

Reputation: 1464

No. You can implement NSFetchedResultsControllerDelegate methods to catch changes to get NSFetchedResultsController to be notified when the underlining data changes (e.g., deletes and adds).

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.tableView;

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}

Upvotes: 1

Related Questions