2

背景

这与我上一个问题的背景相同,除了大纲视图没有提取谓词。

  • 我有一个NSOutlineView显示 TrainingGroup 实体的。

  • 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];

  • 从功能上讲,这工作正常 - 当上下文合并回主时,所有后代都分配给项目。

问题

  • 在合并时,NSOutlineView绑定到主上下文的那个会冻结,合并可能需要几秒钟才能完成。

  • 为了减少这种冻结,我将这些组分批分配到几个较小的操作中。

这种批量后台操作方式存在三个问题:

  1. 界面在几分之一秒内变得无响应。这没什么大不了的,但它确实意味着界面中有一些不可预测的小停顿。

  2. 大纲视图会更新合并回来的每个批次。这样做时,选择可能会出现故障。

  3. 分配组下的一些项目保持空白。对象已分配项目,但大纲视图未正确刷新项目。大概是因为主线程被合并打断了。

您可以在我录制的截屏视频中看到这些问题:

http://screenr.com/Fk4

替代方案

我可以将每个操作的更改合并到在后台线程上运行的托管对象上下文中。他们也许我可以向主线程发送一条消息以刷新已更改的顶级组中的所有对象。

这可能会摆脱上面的问题 1 和 3,但我认为 2 仍然是一个问题。

我的问题

有没有更好的方法来做到这一点?

在我开始重新设计我如何做到这一点之前(我已经改变了它的工作方式一次)我想知道是否有更好的方法或者这种方法有什么我不知道的缺点。

提前感谢您对替代品的任何建议。

4

1 回答 1

0

我现在生活在冰冻之中。但我认为答案是将我的 NSOperations 并行化,并尽可能减少将合并所需的时间。毫无疑问,我可以对数据模型进行很多改进,以使操作也更容易合并。

我最近尝试在后台线程上实现合并,但很难让它工作。我想这将是我重新审视的东西。

于 2010-10-18T00:38:56.040 回答