核心数据:我们需要在每次删除后重新获取吗?

时间:2014-08-16 20:23:48

标签: ios core-data swift ios8 nsfetchedresultscontroller

嗨请有人帮帮我吗?

我正在使用核心数据 tableview控制器。我使用的是 NSFetchedResultsController(NSFRC) NSManagedObjectContext(NSMOC)

1)我在视图中NSFRC.performFetch做了加载 2)当用户删除我正在执行的行NSMOC.deleteObject

应用程序崩溃,抱怨删除后行数没有减少

在删除后立即执行NSFRC.performFetch解决问题。但我认为它应该工作,没有我们不得不强制取一个?请有人向我解释一下吗?顺便说一句,我正在使用 IOS 8 (beta 5)和Swift

1 个答案:

答案 0 :(得分:1)

没有。您可以实现NSFetchedResultsControllerDelegate方法来捕获更改,以便在下划线数据发生更改(例如,删除和添加)时通知NSFetchedResultsController。

- (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];
}