是否应该预取任何故障?

时间:2012-06-24 14:50:31

标签: iphone ios cocoa core-data

我试图看看我是否正确理解了使用Core Data进行预取。我正在为Message对象执行batchSize为20的获取请求,与MBDate属性具有一对一的关系。我预取了这个属性:

[fetchRequest setRelationshipKeyPathsForPrefetching:
           [NSArray arrayWithObjects:@"date", nil]];

prefetch命令通过,如此输出所示:

CoreData: annotation: Prefetching with key 'date'.  Got 9 rows.
CoreData: annotation: total fetch execution time: 0.0094s for 20 rows

然而,在第一批中,如果我这样做

if(message.date.isFault) NSLog(@"isFault");

它始终输出isFault,即使我已预取它!如果我尝试访问MBDate对象的任何属性,则会触发故障请求:

CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDATE, t0.ZDATESTRING FROM ZMBDATE t0 WHERE  t0.Z_PK = ? 
CoreData: annotation: sql connection fetch time: 0.0008s
CoreData: annotation: total fetch execution time: 0.0014s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x85d22b0 <x-coredata://736D04C4-7DB3-40B7-B208-79B5DFD68260/MBDate/p61>

为什么预取不通过?为什么我的物体仍有故障? 我知道很难给出任何明确的答案,但任何提示或想法都会很棒!

1 个答案:

答案 0 :(得分:1)

您可以在不设置批量大小的情况下尝试同样的事情吗?

fetchBatchSize 下的NSFetchRequest类参考中有一个奇怪的注释:

  

如果设置非零批量大小,则返回对象集合   当执行获取被分成批次时。当获取时   执行,评估整个请求和所有的身份   匹配记录的对象,但不超过batchSize对象的数据   将一次从持久存储中获取。阵列   从执行请求返回的将是一个代理对象   透明地根据需要对批次进行故障处理。

就像你设置了batchSize一样,无论如何,返回的对象都会出现故障。