如何让我的应用程序更具响应性?

时间:2010-10-02 23:37:29

标签: multithreading cocoa core-data nsoperation

背景

这与我的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. 界面在几分之一秒内无响应。这不是什么大问题,但它确实意味着界面中存在小的不可预测的暂停。

  2. 大纲视图会更新已合并的每个批次。当它执行此操作时,选择可能会很糟糕。

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

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

    http://screenr.com/Fk4

    替代

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

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

    我的问题

    有更好的方法吗?

    在我开始改变工作之前(我已经改变了它的工作原理)我想知道是否有更好的方法,或者我不知道这种方法有任何缺点。

    提前感谢有关替代品的任何建议。

1 个答案:

答案 0 :(得分:0)

我目前正在接受冻结。但我认为答案是将我的NSOperations并行化,并尽可能缩短合并时间。毫无疑问,我可以对数据模型进行大量改进,以使操作更容易合并。

我最近尝试在后台线程上实现合并,但努力使其工作。我想,这将是我重新审视的事情。