保存背景上下文后NSFetchedResultsController NSRangeException

时间:2013-01-30 06:49:13

标签: ios uitableview core-data nsfetchedresultscontroller

我自己无法重现这一点,所以我必须经历的是我收集的一些错误日志。无法真正想出这个。发生崩溃时,有2个FetchedResults控制器处于活动状态。一个在主屏幕上显示每个类别中有多少项,另一个用于处理您深入研究的类别。我所知道的其余回溯是在钻取的向下视图上插入一个对象时总会发生这个问题。有任何想法吗?有人至少可以确认问题在于更新主屏幕上的单元格而不是在详细信息屏幕上插入单元格吗?

错误:

**请注意,有趣的部分似乎是我在此问题上收到的5-10个日志中{0,3}和界限[0 .. 1]的范围始终相同**

特定应用信息: *由于未捕获的异常终止应用程序\'NSRangeException \',原因:\'* - [NSArray indexOfObject:inRange:]:范围{0,3}超出边界[0 .. 1] \ “

最后一次异常回溯: 0 CoreFoundation 0x35ad988f __exceptionPreprocess + 163
1 libobjc.A.dylib 0x336fd259 objc_exception_throw + 33
2 CoreFoundation 0x35acda09 - [NSArray indexOfObject:inRange:] + 205
3 CoreData 0x32e8e73d - [_ NSDefaultSectionInfo indexOfObject:] + 133
4 CoreData 0x32e8f299 - [NSFetchedResultsController indexPathForObject:] + 149
5 CoreData 0x32e956f5 - [NSFetchedResultsController(PrivateMethods)_managedObjectContextDidChange:] + 4361

创建控制器:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:self.groupID];

NSFetchedResultsController代码:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath
{

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;
        case NSFetchedResultsChangeMove:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

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

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

配置单元格:

-(void)configureCell:(MessageRow *)cell atIndexPath:(NSIndexPath *)indexPath {

    MymanagedObject *myobj = [self.convoController objectAtIndexPath:indexPath];
    cell.title = myobj.title
 }

请注意,在我的主屏幕上,所有操作基本上都是以相同的方式完成的,除非在更新时重新加载tableview行而不是已配置

case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        break;

1 个答案:

答案 0 :(得分:0)

我有类似的问题。

诀窍是跟踪屏幕上的内容以及屏幕外的内容。我检查NSFetchedResultsControllerDelegate回调中的那些条件,如果FRC指的是屏幕外数据,则不进行任何更新。

您可以稍后使用viewWillAppear中的触发器“赶上”更新。