NSFetchedResultsController - 严重的应用程序错误

时间:2014-03-10 15:26:07

标签: objective-c core-data nsfetchedresultscontroller

在我的应用中,我NSFetchedResultsController会在数据库的每次更改中更新我的表格。

在更改过程中某些时候应用程序出现问题,无论我做什么,表都保持空白(即使我更改了屏幕并返回,表仍为空)。

只有在关闭应用程序并将其重新打开后,所有内容似乎再次正常。

我将问题隔离到此错误

  

“CoreData:错误:严重的应用程序错误。捕获到异常   在调用期间来自NSFetchedResultsController的委托   -controllerDidChangeContent :.无效更新:第0部分中的行数无效。现有部分中包含的行数   更新后(19)必须等于包含的行数   更新前的那一节(19),加上或减去行数   从该部分插入或删除(3个插入,0个删除)和加号   或减去移入或移出该部分的行数(0移动   in,0搬出去了)。 with userInfo(null)“

这似乎与“开始更新”和“结束更新”中的行号之间的解释性差异有关,这意味着在删除或插入行时出现错误。

使用断点很难调试,因为事情并非经常发生。

有什么建议吗?

我的代码:

#pragma mark - NSFetchedResultsControllerDelegate
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{   
     [self.guiTableView beginUpdates];  
}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{   
        switch(type) {
            case NSFetchedResultsChangeInsert:

                [self.guiTableView beginUpdates];

                [self.guiTableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationAutomatic];

                 [self.guiTableView endUpdates];
                break;

            case NSFetchedResultsChangeDelete:
                [self.guiTableView beginUpdates];

                [self.guiTableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationLeft];


                [self.guiTableView endUpdates];

    //            if (controller.sections.count==0) {
    //                [self alertAboutNothingInMyAssetsAndPop];
    //            }
                break;
        }

}

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

    SOOptionCell *cell;

    switch(type) {
        case NSFetchedResultsChangeInsert:

            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

            break;

        case NSFetchedResultsChangeDelete:

            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];


            break;

        case NSFetchedResultsChangeUpdate:
            cell = (SOOptionCell *)[tableView cellForRowAtIndexPath:indexPath];
            [self configureCell:cell atIndexPath:indexPath animated:YES];
            break;

        case NSFetchedResultsChangeMove:

            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationAutomatic];


            break;
    }   
}   

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller{       

     [self.guiTableView endUpdates];    
}

1 个答案:

答案 0 :(得分:2)

首先,删除委托方法中的所有 - beginUpdates-endUpdates调用。应该只有一个。 -beginUpdates中的一个-controllerWillChangeContent:-endUpdates中的一个-controllerDidChangeContent:。我甚至会说你应该将其他方法改回Apple提供的示例,而不是自己编写。

一旦你这样做,差异就会消失吗?我怀疑它会。