iphone - 使用 .@count 谓词进行简单获取需要很长时间(约 30 秒)

标签 iphone core-data nspredicate

我有 2 个实体,A 和 B,它们具有多对多关系。

A 实体大约有 10,000 个对象,B 大约有 20 个对象。

基本上,A 对象可以与一个或多个 B 对象相关,并且 B 对象会跟踪它们连接到哪些 A 对象。这是通过逆关系设置完成的。

我只是希望返回与 A 对象无关的每个 B 对象。我使用的获取是这样的:

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setIncludesPropertyValues:NO];
[fetch setEntity:[NSEntityDescription entityForName:@"B" inManagedObjectContext:context]];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"aObjects.@count == 0"]];
return [context executeFetchRequest:fetch error:nil];

但是,如果提取执行需要很长时间,大约。 30秒。我不明白这一点,因为虽然有大量的A对象,但是这次fetch与它们无关,只需检查20个B对象即可。

如果我注释掉谓词,以便获取返回所有 B 对象,那么获取速度非常快,正如您期望的那样,只需获取 20 个对象。因此,该谓词似乎涉及了一些 A 对象,并导致它需要很长时间!

谁能解释一下为什么要花这么长时间吗?

编辑:

我已经获得了 SQL 调试信息,以下是输出内容:

CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK FROM ZTABLEVIEWOBJECT t0 WHERE ((SELECT COUNT(*) FROM ZTABLEVIEWOBJECT t1 JOIN Z_10BOBJECTS t2 ON t1.Z_PK = t2.Z_10AOBJECTS3 JOIN ZTABLEVIEWOBJECT t3 ON t2.Z_12BOBJECTS = t3.Z_PK WHERE (t0.Z_PK = t2.Z_12BOBJECTS) ) = ? AND  t0.Z_ENT = ?) 
CoreData: annotation: sql connection fetch time: 49.4198s
CoreData: annotation: total fetch execution time: 49.4240s for 0 rows.

我应该补充一点,实体 A 和实体 B 都继承(有一个父级)一个公共(public) TableViewObject 实体,该实体保存两者之间的公共(public)值(例如 TableView 部分名称和排序名称等)。希望这有帮助!

最佳答案

你可以替换

aObjects.@count == 0

ANY aObjects == nil

它大大减少了我的查询时间(iPhone OS 3.0)。它也适用于 != nil (@count != 0)。

关于iphone - 使用 .@count 谓词进行简单获取需要很长时间(约 30 秒),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1999919/

相关文章:

iphone - 如何建立测光表程序?

ios - collectionView 中每个单元格的 NSFetchedResultsController

core-data - NSFetchedResultsController 与 NSFetchRequest 中的 NSDictionaryResultsType

ios - 你如何构造 NSFetchRequest setHavingPredicate :? 的谓词

ios - NSPredicate 匹配 "any entry in an NSDatabase with value that contains a string"

iphone - 如何使用 NSURLRequest 在 Http 请求中发送 json 数据

iphone - 如何在 iPhone 5 中获得黑边

core-data - iCloud 超时。 (使用iCloud + Core Data + Magical Record

ios - 有没有比删除目录更快/更好的方法来清除 iPhone 模拟器缓存?

ios - 核心数据 : Create temporary models and maybe save to context