2011-04-28 24 views
0

我在模型中有一个对象,当被修改时需要大量其他对象根据这些更改重新计算值。核心数据:触发一个属性更改的长时间运行

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

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

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

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

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

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

简而言之:

什么是这种依赖关系的最佳做法是什么?

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

回答

0

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

  • 中心片模型对象手表本身的变化对变化
  • ,它创建或修改了一个ToDo对象
  • 控制器手表新ToDo对象
  • 控制器使ToDo出队,呈现进度条并执行操作