核心数据难题:不能两次调用 NSFetchedResults

Posted

技术标签:

【中文标题】核心数据难题:不能两次调用 NSFetchedResults【英文标题】:Core Data Conundrum: Cannot call NSFetchedResults twice 【发布时间】:2013-05-20 21:27:28 【问题描述】:

我有一个自定义 UITableViewController,称为 mainViewController。

它在头文件中有一个公共属性

@property (strong, nonatomic) NSMutableArray *someGroups;

这个属性是在viewDidLoad方法中设置的

_someGroups = [[GGGroups findAllSortedBy:@"lastUpdated" ascending:NO withPredicate:[NSPredicate predicateWithFormat:@"ANY users = %@", [GGUser currentUser]]] mutableCopy];

但是,出于某种原因,如果我调用以下命令,一旦视图加载完毕,它会返回 0 个对象

[[GGGroups findAllSortedBy:@"lastUpdated" ascending:NO withPredicate:[NSPredicate predicateWithFormat:@"ANY users = %@", [GGUser currentUser]]] mutableCopy];

这很烦人,尤其是当我想在表格视图控制器中reloadData 时,因为这个数组是数据源,所以表格视图变成空白,因为这个方法现在返回 0 个对象。

我目前正在使用 MagicalRecord,有谁知道为什么会发生这种情况。

谢谢!

【问题讨论】:

那么当你进入那个方法时会发生什么?您已经获得了 MagicalRecord 代码,并且 MR_findAllSortedBy:... 并不是非常复杂,因此请介入并找出为什么您的获取请求失败。是否发生错误?上下文为零吗? 我不知道如何进入方法调用,对不起,我正在制作我的第一个 ios 应用程序,所以我对一些东西不熟悉 @Caleb 您会在Xcode User Guide 中找到instructions,可以从Xcode 本身的方便帮助菜单中访问。花一两个小时学习使用调试器将比 Stack Overflow 对您的帮助更大。 哦,我明白了,我有点知道该怎么做,我从来没有看过堆栈跟踪,只是控制台,谢谢@Caleb 【参考方案1】:

MagicalRecord 中没有任何内容可以缓存您的 find* 请求。对任何 find 方法的每次调用都会生成一个新请求并对该新请求执行新的 fetch。我对您的第二次获取失败的原因的猜测:

    默认上下文(您通过未指定一个而隐式使用的上下文)不知何故为 nil 您的 currentUser 方法返回 nil 您的数据存储在第二次调用时为空 您实际上并没有在正确的时间调用您的方法来重新加载数据 您没有刷新数据视图

MagicalRecord 内置了日志记录。我建议打开它并查看日志中是否出现任何错误。这些将有助于查明 Core Data 可能出现的任何问题。

【讨论】:

2,3,4,5 都可以,所以我猜由于某种原因 defaultContext 为 nil,我该如何取消它? 你确定吗?您可以在每个 find 方法上使用(可选)inContext: 参数显式指定上下文。创建一个不为 nil 的上下文,然后尝试一下。

以上是关于核心数据难题:不能两次调用 NSFetchedResults的主要内容,如果未能解决你的问题,请参考以下文章

核心数据中的触发器

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedRe

为啥我不能在打开的文件上调用 read() 两次?

致命异常:NSInternalInconsistencyException 此请求已被绝育 - 您不能调用 -sendResponse: 两次,也不能在编码后调用

Python:不能在类中使用函数两次,TypeError:'list'对象不可调用,为什么? [关闭]

为啥 Core Data 托管对象的 +initialize 方法会被调用两次?