我正在编写一个显示食谱的基于核心数据的 iPhone 应用程序。为了提高性能,在 TableView 中显示它们时,我想启用批处理 (-setFetchBatchSize:) 并仅获取“名称”属性 (-setPropertiesToFetch:)。当我打开两者时,它不起作用并且列表为空。只要我注释掉下面代码中标记的行之一,它就可以正常工作。
我在这里缺少什么?两者兼得是不可能的?
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Rezept" inManagedObjectContext:chk_context]];
// *snip*
//BATCHING
[fetchRequest setFetchBatchSize:25];
NSDictionary *entityProperties = [[NSEntityDescription entityForName:@"Rezept" inManagedObjectContext:chk_context] propertiesByName];
//PROPERTIES
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"name"]]];
最佳答案
我远不是核心数据专家,但我让它在我的情况下成功地工作。我认为 setFetchBatchSize 和 setPropertiesToFetch 之间的“冲突”更多是核心数据如何工作的副作用,而不是本身的错误。
就我而言,我做了两次提取。在第一个中,结果类型设置为 NSManagedObjectResultType,我使用 setFetchBatchSize 来限制主动带入内存的数据量。在第二次提取中,我根据单个属性填充标题数组,并将结果类型设置为 NSDictionaryResultType,将 fetchBatchSize 设置为 0(无限)。
根据测试,此场景完美运行。初始提取中的所有记录(带有实际的托管对象)都受到 fetchBatchSize 的错误和内存限制。第二次获取返回一个简单的标题字典。这比遍历所有实际托管对象以访问标题属性占用的内存要少得多。第二次获取需要禁用 fetchBatchSize 是有道理的,因为它将完全填充的字典作为单个结果返回,并且批处理不合适。
我不确定我在这里是否 100% 清楚(核心数据术语有点神秘......)但最重要的是我认为一切都按预期工作。