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

我想使用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; 
}

您将不得不对各种可能性和配置进行一些研究,但是您可以了解情况.

点赞