NSArrayController无需将大型数据集加载到数组中

时间:2011-03-01 17:16:45

标签: cocoa

我想使用NSArrayController为NSTableView提供数据。我面临的问题是我不想将所有数据预先加载到数组中,然后使用数组控制器setContent:方法。我的数据模型是一个庞大的现有代码库,可管理数百万条记录。它包含有效返回一组数据行的方法。

根据我在限制NSArrayController中对象数量时发现的一个例子,我尝试了继承NSArrayController并重写arrangedObjects:方法以返回我编写的数组代理类。数组代理类提供了count:objectAtIndex:方法。 objectAtIndex:返回的对象是NSDictionary。当我尝试从arrangedObjects:方法返回我的数组代理时,count:objectAtIndex:都被调用,但我的_valueForKeyPath:ofObjectAtIndex:数组代理类上也出现了无法识别的选择器错误。这看起来像一个私人方法,所以我没有继续这条路。

我还想过从arrangedObjects:返回一个较小的数据数组,但是无法弄清楚我将如何确定NSTableView试图显示哪些行。

数据源是与我现有数据模型接口的“正确”方法,还是有一些方法可以使NSArrayController工作?

1 个答案:

答案 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; 
}

您必须对各种可能性和配置进行一些研究,但是您可以了解情况。