代码之家  ›  专栏  ›  技术社区  ›  John Gallagher

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

  •  2
  • John Gallagher  · 技术社区  · 14 年前

    这和我的背景一样 previous question ,但Outline视图没有fetch谓词。

    • 我有一个 NSOutlineView

    • 这个 大纲视图 一定会有 NSTreeController

    • 在NSTreeController中,我勾选了“preserveselection”,取消了“selectinsertedobjects”。

    • 每个TrainingGroup代表本地机器上的一个文件夹。

    • 每个培训小组可以分配到一个项目。项目应该传播到该组的所有后代。

    • 项目列绑定到每个培训组的项目属性。

    大纲视图

    这棵树看起来像这样:

    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时,所有子体都被分配给项目。

    问题

    • 合并时 大纲视图

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

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

    2. outline视图更新合并回的每个批。当它这样做时,选择可能会有问题。

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

    http://screenr.com/Fk4

    另一种选择

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

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

    我的问题

    有没有更好的办法?

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

    提前感谢您对备选方案的任何建议。

    1 回复  |  直到 7 年前
        1
  •  0
  •   John Gallagher    14 年前

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