为什么我的所有NSManagedObjects立即被指责?(Why are all my NSMan

2019-09-18 10:31发布

我正在返回约2000对象一个非常基本的读取请求。 我使用的为15的BATCHSIZE的NSFetchedResultsController。

    predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName];
    [fetchRequest setPredicate:predicate];

    NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:15];
   self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:@"createDay" cacheName:nil];

该找取请求需要10秒以上虽然。 我已经启用SQLite的调试,所以我可以看到发生了什么事情。 我认为这是获取,在2000年的实体,只有15与实际值,然后因为某些原因要通过每一个2000年的对象,并在断层他们。

在取,这些线路出现上千次:

2012-06-22 21:14:47.546 app[9227:707] CoreData: annotation: sql connection fetch time: 0.0107s
2012-06-22 21:14:47.551 app[9227:707] CoreData: annotation: total fetch execution time: 0.0171s for 15 rows.
2012-06-22 21:14:47.568 app[9227:707] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE, t0.ZISGLOBAL, t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 WHERE  t0.Z_PK IN  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)  ORDER BY t0.ZCREATEDATE DESC LIMIT 15
...thousands more lines exactly similar to the three above

我的表只显示5个细胞一时间,所以我不知道为什么所有的对象都在刚要发生故障。 可能是什么造成的? 为什么所有对象中立即出现故障,没有我,甚至我的滚动表? 可以这么认为,他们正在访问的地方,也许是重复? 是否调用NSArray *fetchedObjects = fetchedResultsController.fetchedObjects造成任何机会被指责的所有对象?

Answer 1:

检查出什么有关的文件中说batchSize (我的重点):

该缺省值是0的0批量大小被视为无穷大,即禁用批处理断裂行为。

如果设置为非零批量大小,对象的集合返回时执行分成批量抓取。 执行当抓取, 整个请求进行评估 ,所有匹配的对象的身份记录,但不超过batchSize对象的数据将从 在时间的持久性存储中获取 。 从执行请求返回的数组将是一个代理对象对按需透明故障批次。 (在数据库术语,这是在内存中的光标。)

您可以使用此功能来限制应用程序中的数据的工作集。 在与fetchLimit组合,您可以创建任意结果集的一个子范围。

所以,很显然,按照这样的解释,你会得到2000/15往返商店。 这当然需要一定的时间。 你需要,因为你的排序和所有的数据ANY谓词,但你指示要求,在同一时间只得到15。

此外,对于完整性,从先前的评论:降compare从您的排序描述符。



Answer 2:

您所看到的行为以及核心数据编程指南中所述批次断层和预取款。

总之,你应该,如果你使用的是谓词来获取该有一个特定名字,标签的对象预取标签的对象。 这是因为通常撷取你的对象时,核心数据不取相关对象,但使用的故障来代替。 现在你的谓词触发单独发射这些错误是缓慢的。



文章来源: Why are all my NSManagedObjects being faulted immediately?