首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存背景上下文后的NSFetchedResultsController NSRangeException

保存背景上下文后的NSFetchedResultsController NSRangeException
EN

Stack Overflow用户
提问于 2013-01-30 06:49:12
回答 1查看 350关注 0票数 2

我自己无法复制这些日志,所以我所要做的就是收集一些错误日志。我真想不出这件事。当崩溃发生时,有2个FetchedResults控制器处于活动状态。一个在主屏幕上显示每个类别中有多少项,另一个用于处理钻入的类别。在后面的回溯中,我所知道的是,在向下钻取的视图中插入对象时,总是会出现这个问题。有什么想法吗?至少有人能确认问题在于更新主屏幕上的单元格而不是在细节屏幕上插入单元格吗?

错误:

**请注意,有趣的部分似乎是范围{0,3}和界0 ..在我收到的关于这个问题的5-10条日志中,1总是相同的**

应用程序特定信息:*终止应用程序由于未登录异常\'NSRangeException\',原因:\'* -NSArray indexOfObject:inRange::range {0,3}超出界限0 .1‘

上次异常回溯:0 CoreFoundation 0x35ad988f __exceptionPreprocess + 163

1 libobjc.A.dylib 0x336fd259 objc_exception_throw + 33

2 CoreFoundation 0x35acda 09 -NSArray索引-NSArray:inRange:+ 205

3 CoreData 0x32e8e73d -_NSDefaultSectionInfo indexOfObject:+ 133

4 CoreData 0x32e8f299 -NSFetchedResultsController indexPathForObject:+ 149

5 CoreData 0x32e956f5 -NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:+ 4361

创建主计长:

代码语言:javascript
复制
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:self.groupID];

NSFetchedResultsController代码:

代码语言:javascript
复制
- (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];
}

配置单元格:

代码语言:javascript
复制
-(void)configureCell:(MessageRow *)cell atIndexPath:(NSIndexPath *)indexPath {

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

请注意,在我的主屏幕上,除了在更新时表视图行被重新加载而不是配置之外,一切都是以相同的方式完成的。

代码语言:javascript
复制
case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        break;
EN

回答 1

Stack Overflow用户

发布于 2013-01-30 16:55:00

我也有过类似的问题。

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

例如,您可以通过在viewWillAppear中使用触发器来“赶上”稍后的更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14598222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档