核心数据:在更改属性时触发长时间运行的操作

时间:2011-04-28 19:20:09

标签: cocoa core-data

我在模型中有一个对象,修改后需要大量其他对象根据这些更改重新计算值。

目前设置的方式是,这个对象只能在一个地方修改。这是一张带有取消和确定按钮的工作表。用户提交更改后,工作表会显示一个进度条并开始处理受更改影响的对象。工作表的显示和解除包装在NSUndoManager组中。用户可以在取消工作表后撤消一次通过中的所有更改。

困扰我的是,我一直认为这一切都应该发生在业务层面。而不是在控制器级别。即我应该能够在UI和代码中的任何地方修改我的业务对象,并让它触发必要的计算。

所以我会设置KVO来观察我的对象并在需要时触发长时间运行的操作。一旦我沿着那条路走下去,我就开始撞墙了。

  • 如何合并更改?我的对象有几个属性。我不想在第一个属性发生变化时开始计算,第二个属性可能会在下一个变化。基本上我需要一个编辑表和一些控制点来同时提交所有更改。

  • 如何为这个长时间运行的操作添加UI?我可以将一个NSOperationQueue附加到NSManagedObjectContext并让我的窗口控制器观察到它。当队列不为空时,我会弹出一张工作表,其中包含一个监控当前操作的进度条。

  • 如何实施撤消/重做支持?如果我将重新计算延迟到事后运行的操作,我无法想象如何撤消初始更改并同时传播一次。我只能想象撤消原始更改并触发对所有其他对象的另一次重新评估。

简而言之:

此类依赖的最佳做法是什么?

传播是模型层还是控制层的工作?

1 个答案:

答案 0 :(得分:0)

我相信我想出了一个解决方案:

  • 中间件模型对象监视自身的更改
  • 在更改时,它会创建或修改ToDo对象
  • 控制器监视新的ToDo对象
  • 控制器使ToDo出列,呈现进度条并执行操作