Ios NSFetchedResultsController:objectAtIndexPath:导致NSInvalidArgumentException

Ios NSFetchedResultsController:objectAtIndexPath:导致NSInvalidArgumentException,ios,core-data,crash,Ios,Core Data,Crash,我正在使用一些类来处理核心数据和远程JSON服务之间的同步,在其中一个类中,管理当前核心数据中的对象,我随机遇到几次崩溃 方法 阶级 @interface XLLocalDataLoader() //私有财产 @属性(强,非原子)NSFetchedResultsController*fetchedResultsController; 方法 // get core data object at index path -(NSManagedObject *)objectAtIndexPath:(N

我正在使用一些类来处理
核心数据
和远程
JSON
服务之间的同步,在其中一个类中,管理当前
核心数据
中的对象,我随机遇到几次崩溃

方法

阶级

@interface XLLocalDataLoader()
//私有财产
@属性(强,非原子)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;
}
//在索引路径获取核心数据对象
-(NSManagedObject*)对象索引路径:(NSIndexPath*)索引路径
{
if([indexPath行]<[self numberOfRowsInSection:indexPath.section]){
返回[self.fetchedResultsController对象索引路径:indexPath];
}
返回零;
}
源代码

源代码可在以下位置获得:

错误

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

已调查

  • 问题

  • 是否有一些指导原则来尝试复制和调试
    NSInvalidArgumentException
  • 你知道我做错了什么吗

  • 在“loader”类中使用获取的结果控制器似乎是错误的方法

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

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

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

    // 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;
    }