gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:15:08 26 4
gpt4 key购买 nike

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

按照我发现的限制 NSArrayController 中对象数量的示例,我尝试子类化 NSArrayController 并覆盖 arrangedObjects: 方法以返回我编写的数组代理类。数组代理类提供了 count:objectAtIndex: 方法。 objectAtIndex: 返回的对象是一个 NSDictionary。当我尝试从 arrangedObjects: 方法返回数组代理时,count:objectAtIndex: 都被调用,但我也收到无法识别的选择器错误在我的 _valueForKeyPath:ofObjectAtIndex: 数组代理类上。这看起来像是一个私有(private)方法,所以我没有继续沿着这条路走下去。

我还考虑过从 arrangedObjects: 返回一个较小的数据数组,但无法弄清楚如何确定 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;
}

您必须对各种可能性和配置进行一些研究,但您已经了解了。

关于cocoa - NSArrayController 无需将大型数据集加载到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5157911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com