NSFetchedResultsController:objectAtIndexPath:导致NSInvalidArgumentException

时间:2015-09-18 12:28:50

标签: ios core-data crash

我正在使用一些类来处理Core Data和远程JSON服务之间的同步,并且在其中一个类中管理当前位于Core Data的对象,我得到了几个随机崩溃。

方式

 @interface XLLocalDataLoader() <NSFetchedResultsControllerDelegate>

    // private properties
    @property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;

方法

// get core data object at index path
-(NSManagedObject *)objectAtIndexPath:(NSIndexPath *)indexPath
{
    if ([indexPath row] < [self numberOfRowsInSection:indexPath.section]){
        return [self.fetchedResultsController objectAtIndexPath:indexPath];
    }
    return nil;
}

源代码

源代码位于GitHub -> XLDataLoader -> XLLocalDataLoader

错误

  

致命异常:NSInvalidArgumentException对象的持久性存储   无法从此NSManagedObjectContext的协调器

访问

已经调查

  1. NSFetchedResultsController crashes on objectAtIndexPath?
  2. NSFetchedResultsController objectAtIndexPath crash (EXC_BAD_ACCESS)
  3. NSFetchedResultsController Crash
  4. NSFetchedResultsController objectAtIndex, objectAtIndexPath, indexPathForObject inconsistencies
  5. Deleting last row in a section -> crash, using NSFetchedResultsController
  6. 问题

    1. 是否有一些指南可以尝试重现和调试NSInvalidArgumentException
    2. 关于我做错了什么的想法?

1 个答案:

答案 0 :(得分:2)

在&#34;装载机中使用取出的结果控制器&#34;上课似乎是错误的做法。

获取的结果控制器实际上是为了帮助您在表格视图中显示核心数据内容。显然,正常的用例是在主线程上运行它。

如果要从Web服务获取数据并在成功处理程序中解析它,这意味着它位于不同的线程上。您必须使用单独的上下文(通常是主上下文的子上下文),然后在完成操作数据后保存此上下文。这会将更改推送到主上下文,并且将通过委托通知获取的结果控制器。

错误消息似乎也表明您没有正确管理上下文。