Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使我的应用程序更具响应性? 出身背景_Multithreading_Cocoa_Core Data_Nsoperation - Fatal编程技术网

Multithreading 如何使我的应用程序更具响应性? 出身背景

Multithreading 如何使我的应用程序更具响应性? 出身背景,multithreading,cocoa,core-data,nsoperation,Multithreading,Cocoa,Core Data,Nsoperation,这与我的背景相同,只是Outline视图没有fetch谓词 我有一个显示培训组实体的NSOutlineView NSOutlineView绑定到NSTreeController 在NSTreeController中,我勾选了“保留选择”,取消勾选了“选择插入的对象” 每个培训组代表本地计算机上的一个文件夹 每个培训组可以分配到一个项目。项目应传播到该组的所有后代 项目列绑定到每个培训组的项目属性 这个视图中有很多数据。因为每次条目都有一个条目,所以在一个训练视图下总共可以有15000个后代

这与我的背景相同,只是Outline视图没有fetch谓词

  • 我有一个显示培训组实体的
    NSOutlineView

  • NSOutlineView
    绑定到
    NSTreeController

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

  • 每个培训组代表本地计算机上的一个文件夹

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

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

  • 这个视图中有很多数据。因为每次条目都有一个条目,所以在一个训练视图下总共可以有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委托]managedObjectContext]
    
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
    withObject:通知
    waitUntilDone:是的

  • 从功能上讲,这很好——当上下文合并回主上下文时,所有子体都被分配给项目

问题
  • 合并时,绑定到主上下文的
    NSOutlineView
    将冻结,合并可能需要几秒钟才能完成

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

此批处理后台操作方法存在三个问题:

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

  • outline视图将更新重新合并的每个批次。当它这样做时,选择可能会出现故障

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

  • 你可以在我录制的视频中看到这些问题:

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

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

    我的问题 有更好的方法吗?

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


    提前感谢您对替代方案的建议。

    我目前正处于冻结状态。但我认为答案是并行我的操作,将合并所需的时间减少到尽可能少的程度。毫无疑问,我可以对数据模型做很多改进,使操作更容易合并


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

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


    最近我尝试在后台线程上实现一个合并,但很难让它正常工作。我想,这将是我重新考虑的问题。

    这不是一个简单的答案,因为我不太使用核心数据。但您应该查看有关Advance core data的WWDC视频。他们有一个关于优化性能的部分。只需在iTunes中搜索WWDC 2010。它们是免费的。干杯,谢谢。我真不敢相信我没有想过早点检查这些东西——我知道它们存在。好主意。谢谢。:)这不是一个答案,因为我不太使用核心数据。但您应该查看有关Advance core data的WWDC视频。他们有一个关于优化性能的部分。只需在iTunes中搜索WWDC 2010。它们是免费的。干杯,谢谢。我真不敢相信我没有想过早点检查这些东西——我知道它们存在。好主意。谢谢。:)