2

在“核心数据编程指南”中,Apple 推荐了一种批量触发故障对象集合的方法,它应该实现如下:

NSArray * arrayOfFaults = [NSArray arrayWithObjects:object1,object2,nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self IN %@", arrayOfFaults];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Foo"];
[fetchRequest setPredicate:predicate];
[fetchRequest setReturnsObjectsAsFaults:NO];
[managedObjectContext executeFetchRequest:fetchRequest error:NULL];

然而,在 iOS 6 模拟器上使用“Core Data” Instrument,我发现这个 fetch 几乎和其他 fetch 一样。换句话说,它进入磁盘并且没有使用缓存。这是不合理的。由于它是一个“IN”子句,Core Data 可以使用 objectID 在缓存中查找对象。如果所有这些都可以在缓存中找到,则无需转到磁盘。

我很确定 arrayOfFaults 中的这些对象在缓存中。如果我用这个替换上面的代码,则不会报告缓存未命中:

for (NSManagedObject *object in arrayOfFaults){
   [object willAccessValueForKey:nil];
}

所以我的问题是:有没有办法在利用缓存的同时批量处理故障对象?

4

0 回答 0