multithreading - 如何让我的应用程序响应更快?

标签 multithreading cocoa core-data nsoperation

背景

这和我的 previous question 背景相同,但大纲 View 没有获取谓词。

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

  • NSOutlineView 绑定(bind)到 NSTreeController

  • 在 NSTreeController 中,我选中了“保留选择”并取消选中“选择插入的对象”。

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

  • 每个 TrainingGroup 都可以分配给一个项目。该项目应该传播到该组的所有后代。

  • 项目列与每个训练组的项目属性绑定(bind)。

  • 此 View 中有大量数据。因为每次条目都有一个条目,所以一个训练 View 下总共可以有大约 15000 个后代。

大纲 View

树看起来像这样:

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:通知 waitUntilDone:YES];

  • 从功能上来说,这工作得很好 - 当上下文合并回 main 时,所有后代都被分配给该项目。

问题

  • 合并时,绑定(bind)到主上下文的 NSOutlineView 会卡住,并且合并可能需要几秒钟才能完成。

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

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

  1. 界面在几分之一秒内变得无响应。这不是什么大问题,但它确实意味着界面中会出现不可预测的小暂停。

  2. 大纲 View 会更新合并回的每个批处理。执行此操作时,选择可能会出现问题。

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

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

http://screenr.com/Fk4

替代方案

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

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

我的问题

有更好的方法吗?

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

预先感谢您对替代方案的任何建议。

最佳答案

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

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

关于multithreading - 如何让我的应用程序响应更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3847937/

相关文章:

ios - RestKit在映射或实际插入CoreData DB之前比较本地对象和远程对象

c++ - 如何使用 pthreads 对类成员函数进行多线程处理?

java - 从与创建 ExecutorService 不同的线程调用 ExecutorService.shutdown() 和 waitTermination() 是否安全?

c# - 多线程环境中静态类的线程文化

objective-c - NSMutableURLRequest 不支持用户代理更改

objective-c - NSDrawer 委托(delegate)指向已释放的对象?

macos - 核心数据崩溃报告: sqlite3VdbeHalt in loading array controller

objective-c - NSTableViewDataSource 还是 NSArrayController?

arrays - 从核心数据 Swift 4 中检索数组(可转换)

c++ - 是否可以在 C++ 中检查 (this == NULL) 以终止分离线程的执行?