NSArrayController 绑定到核心数据可以在后台线程中运行获取吗?

Posted

技术标签:

【中文标题】NSArrayController 绑定到核心数据可以在后台线程中运行获取吗?【英文标题】:Can NSArrayController bounds to core data run fetch in background thread? 【发布时间】:2013-11-20 08:30:12 【问题描述】:

我将NSArrayController 绑定到有超过 100k 行要获取的核心数据,并将 UseLazyFetching 设置为 TRUE。 NSTableView 肯定会绑定到 NSArrayController。一切都像这样以编程方式设置:

@implementation MainWindowController 
    NSArrayController *_arrayController;


- (void)windowWillLoad

    _arrayController = [[NSArrayController alloc] init];
    [_arrayController setManagedObjectContext:self.managedObjectContext];
    [_arrayController setEntityName:@"User"];
    [_arrayController setUsesLazyFetching:YES];
    [_arrayController setSelectsInsertedObjects:NO];
    [_arrayController setPreservesSelection:NO];
    [_arrayController fetchWithRequest:nil merge:NO error:NULL];


- (void)windowDidLoad

    [super windowDidLoad];

    [self.tableView bind:NSContentBinding 
                toObject:_arrayController 
             withKeyPath:@"arrangedObjects" 
                 options:nil];

我发现滚动时由延迟获取选项触发的所有获取操作都在主线程中运行,这导致 UI 在获取运行时被阻塞。以下来自仪器。

有没有办法在后台线程中运行获取? 我尝试过使用NSPrivateQueueConcurrencyType 初始化的托管对象上下文,但这没有什么区别。 :( 或者使用可可绑定和核心数据来处理表格视图中的大量行是不是很糟糕?我对 ios 中的 NSFetchedResultsController 非常熟悉,并在 OS X 中寻找类似的操作。

【问题讨论】:

【参考方案1】:

如果您尝试同时进行惰性和多线程提取,那么您将进入一个糟糕的世界......但是!有一个可能对您有用的解决方案。

如果您的对象不是太大(平均每个小于 30K),您可以将它们全部放入内存中。因此,当您第一次加载 tableView 时,只需获取前 100 个(或 1000 个?)对象,然后分派到具有自己的 sub-managedObjectContext 的单独线程并获取所有其余部分,然后将这些对象移动到主 managedObjectContext 中。

这仍然有效,但对我来说似乎可行。

【讨论】:

以上是关于NSArrayController 绑定到核心数据可以在后台线程中运行获取吗?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据、绑定、NSArrayController 和表视图 - 如何生成核心数据上下文的视图

Mac OSX应用程序:与NSArrayController相关的问题NSTableView核心数据添加记录

将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果

遍历 NSTableview 或 NSArrayController 以获取数据

NSArrayController 的奇怪行为

绑定到 NSArrayController 的 core-plot 条形图