我想使用NSArrayController向NSTableView提供数据.我面临的问题是我不想将所有数据预先加载到数组中,然后使用数组控制器setContent:方法.我的数据模型是一个庞大的现有代码库,可管理数百万条记录.它包含有效返回一组数据行的方法.
按照我在限制NSArrayController中的对象数量时发现的一个例子,我尝试了子类化NSArrayController并重写arrangeObjects:方法来返回我写的数组代理类.数组代理类提供了count:和objectAtIndex:方法. objectAtIndex:返回的对象是NSDictionary.当我尝试从arrangeObjects:方法返回我的数组代理时,count:和objectAtIndex:被调用,但我的数组代理类上的_valueForKeyPath:ofObjectAtIndex:我也得到一个无法识别的选择器错误.这看起来像一个私人方法,所以我没有继续这条路.
我还想过从arrangeObjects:返回一个较小的数据数组,但无法弄清楚我将如何确定NSTableView试图显示哪些行.
数据源是与我现有数据模型接口的“正确”方法,还是有一些方法可以使NSArrayController工作?
最佳答案 NSArrayController已经可以使用代理和索引以及延迟加载和整个shabang.你试过按原样使用它吗?如果之后您觉得需要对数据加载进行微观管理,请使用NSFetchRequest.子类NSArrayController并沿这些行添加初始化程序:
+ (id)arrayControllerWithEntityName: (NSString *)entityName error:(NSError **)error
{
id newInstance = [[[self alloc] initWithContent:nil] autorelease];
[newInstance setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
[newInstance setEntityName:entityName];
[newInstance setAutomaticallyPreparesContent:YES];
[newInstance setSelectsInsertedObjects:YES];
[newInstance setAvoidsEmptySelection:YES];
[newInstance setAlwaysUsesMultipleValuesMarker:YES];
NSFetchRequest *dontGobbleRequest = [[[NSFetchRequest alloc] init] autorelease];
//configure the request with fetchLimit and fetchOffset an' all that
NSError *err;
if ([newInstance fetchWithRequest:dontGobbleRequest merge:YES error:&err] == NO) {
//better check docs whether merge:YES is what you want
if(*error && err) {
*error = err;
}
return nil;
}
return newInstance;
}
您将不得不对各种可能性和配置进行一些研究,但是您可以了解情况.