这与我的previous question具有相同的背景,但“大纲”视图没有提取谓词。
我有一个显示TrainingGroup实体的NSOutlineView
。
NSOutlineView
绑定到NSTreeController
在NSTreeController中,我勾选了“保留选择”,并选中了“选择插入的对象”。
每个TrainingGroup代表本地计算机上的文件夹。
每个TrainingGroup都可以分配给一个项目。该项目应该传播给该组的所有后代。
项目列绑定到每个培训组的项目属性。
此视图中有很多数据。因为每次条目都有一个条目,所以在一个培训视图下总共可以有大约15000个后代。
大纲视图
树看起来像这样:
Name Project
Users nil
John nil
Documents nil
Acme Project Acme Project
Proposal.doc Acme Project
12:32-12:33 Acme Project
13:11-13:33 Acme Project
... thousands more here!
Budget.xls Acme Project
Big Co Project Big Co Project
Deadlines.txt Big Co Project
Spec.doc Big Co Project
New Project nil
StartingUp.doc nil
Personal Stuff Personal
MyTreehouse.doc Personal
Movies nil
Aliens.mov nil
StepMom.mov nil
关于项目分配
编辑项目时,所有子项的赋值都发生在后台线程的NSOperation
子类上,因此用户可以自由地进行其他选择并在处理所有后代时移动。
操作完成后,我在主要托管对象上下文中运行mergeChangesFromContextDidSaveNotification:
方法:
mainContext = [[NSApp delegate] managedObjectContext];
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
从功能上来说,这很好用 - 当上下文合并回main时,所有后代都会分配给项目。
在合并时,绑定到主要上下文的NSOutlineView
会冻结,合并可能需要几秒钟才能完成。
为了减少这种冻结,我已经对这些组进行了批量分配,以分配几个较小的操作。
此批处理后台操作方法存在三个问题:
界面在几分之一秒内无响应。这不是什么大问题,但它确实意味着界面中存在小的不可预测的暂停。
大纲视图会更新已合并的每个批次。当它执行此操作时,选择可能会很糟糕。
指定组下的某些项目仍为空白。已为对象分配了项目,但大纲视图未正确刷新项目。大概是因为主线程被合并打断了。
您可以在我录制的截屏视频中看到这些问题:
我可以将每个操作的更改合并到后台线程上运行的托管对象上下文中。他们也许我可以向主线程发送一条消息来刷新顶层组中已更改的所有对象。
这可能会解决上面的问题1和3,但我认为2仍然是一个问题。
有更好的方法吗?
在我开始改变工作之前(我已经改变了它的工作原理)我想知道是否有更好的方法,或者我不知道这种方法有任何缺点。
提前感谢有关替代品的任何建议。
答案 0 :(得分:0)
我目前正在接受冻结。但我认为答案是将我的NSOperations并行化,并尽可能缩短合并时间。毫无疑问,我可以对数据模型进行大量改进,以使操作更容易合并。
我最近尝试在后台线程上实现合并,但努力使其工作。我想,这将是我重新审视的事情。