核心数据难题:不能两次调用 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
致命异常:NSInternalInconsistencyException 此请求已被绝育 - 您不能调用 -sendResponse: 两次,也不能在编码后调用