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

Cocoa 核心数据:在属性更改时触发长时间运行的操作,cocoa,core-data,Cocoa,Core Data,在我的模型中有一个对象,修改时需要大量其他对象根据这些更改重新计算值 目前的设置方式是,这一个对象只能在一个地方修改。这是一张带有“取消”和“确定”按钮的工作表。用户提交更改后,工作表将显示一个进度条,并开始处理受更改影响的对象。工作表的显示和取消将被包装在一个NSUndoManager组中。用户可以在关闭图纸后一次撤消所有更改 让我烦恼的是,我一直认为所有这些都应该发生在业务层面。而不是在控制器级别。也就是说,我应该能够在UI和代码中的任何位置修改我的业务对象,并让它触发必要的计算 因此,我会

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

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

让我烦恼的是,我一直认为所有这些都应该发生在业务层面。而不是在控制器级别。也就是说,我应该能够在UI和代码中的任何位置修改我的业务对象,并让它触发必要的计算

因此,我会设置KVO来监视我的对象,并在需要时触发长时间运行的操作。一旦我沿着那条路走下去,我就开始碰壁

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

如何向这个长时间运行的操作添加UI?我可以将NSOperationQueue连接到NSManagedObjectContext,并让我的窗口控制器观察到这一点。当队列不为空时,我会弹出一个带有进度条的工作表,该进度条监视当前操作

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

简言之:

这种依赖性的最佳实践是什么


传播是模型层还是控制层的作业

我想我想出了一个解决办法:

中心件模型对象会自行监视更改 更改时,它会创建或修改ToDo对象 控制器监视新的ToDo对象 控制器将ToDo出列,显示进度条并执行操作