我想使用NSArrayController为NSTableView提供数据。我面临的问题是我不想将所有数据预先加载到数组中,然后使用数组控制器setContent:
方法。我的数据模型是一个庞大的现有代码库,可管理数百万条记录。它包含有效返回一组数据行的方法。
根据我在限制NSArrayController中对象数量时发现的一个例子,我尝试了继承NSArrayController并重写arrangedObjects:
方法以返回我编写的数组代理类。数组代理类提供了count:
和objectAtIndex:
方法。 objectAtIndex:
返回的对象是NSDictionary。当我尝试从arrangedObjects:
方法返回我的数组代理时,count:
和objectAtIndex:
都被调用,但我的_valueForKeyPath:ofObjectAtIndex:
数组代理类上也出现了无法识别的选择器错误。这看起来像一个私人方法,所以我没有继续这条路。
我还想过从arrangedObjects:
返回一个较小的数据数组,但是无法弄清楚我将如何确定NSTableView试图显示哪些行。
数据源是与我现有数据模型接口的“正确”方法,还是有一些方法可以使NSArrayController工作?
答案 0 :(得分:2)
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;
}
您必须对各种可能性和配置进行一些研究,但是您可以了解情况。