我一直在尝试在核心数据中使用第二个托管对象上下文(MOC)来添加将在NSTableView中列为待处理的销售,直到用户按下按钮来处理事务。
按下按钮后,将保存第二个上下文,NSManagedObjectContextDidSaveNotification会在主上下文中触发mergeChangesFromContextDidSaveNotification。
到目前为止确定。但是,接下来我需要清除第二个上下文,以便下面的销售交易在空白的MOC上。也可以通过取消操作或更改用户来清除它。
似乎无法清除第二个MOC ......在寻找解决方案之后,我已经确信这不是一个可行的核心数据模式。相反,我现在回溯只使用一个上下文。但是,当前的销售现在显示所有交易,我只想要当前的交易。同样,如果我可以在那里列出当前的“待处理”交易,请在必要时使用“取消”按钮撤消这些交易;并且在“流程销售”按钮之后清除表格,将实现类似的管理交易的方式。
所以我现在陷入困境,因为没有明显的方法来识别来自其他近期交易的“当前”/待处理交易。
我需要一个两步数据输入。 (1)添加销售,编辑等。(2)流程即提交这些销售
所以第一个策略现在似乎原则上确定并且由(http://developer.apple.com/library/mac/#documentation/DataManagement/Devpedia-CoreData/managedObjectContext.html)和本教程(http://www.timisted.net/blog/archive/multiple-managed-object-contexts-with-core-data/)
建议然而,该教程中使用的方法仅在第二个上下文中保留单个托管对象,并根据需要进行复制/删除。
使用第一种方法和第二种MOC的最佳策略是什么,并且复制&删除交易而不是合并?
或者是否有一个我没有看到的更简单的解决方案?
希望这个问题有意义:-)和任何帮助赞赏
答案 0 :(得分:1)
只需为您的交易实体引入状态属性,您可以在其中保留有关待处理交易的信息。在输入过程中,经常保存(由于数据非常少,因此不会太昂贵)。通过这种方式,您可以完全关闭应用程序,并通过从持久存储中重建相同的情况来准确地恢复用户停止的位置...
无论如何,你转向一个MOC的策略是正确的。
答案 1 :(得分:0)
关于实现解决方案的技术性,想要共享该方法,因为在将结果应用于谓词方面似乎很难理解界面构建器。 实际上我浪费了一些时间来寻找一种方便的方法来利用绑定和界面构建器。
因此,似乎有用的是为每个输出表添加自定义NSArrayControllers。在待定销售表中,绑定到SalesController;我只是将NSArrayController子类化,然后在awakeFromNib
中进行更改,如下所示。注释掉的行是完全没有影响的尝试,因此我并不真正理解fetch谓词的作用,但设置过滤谓词确实具有所需的效果。对于列出已确认的交易,其相同但“挂起==否”
-(void)awakeFromNib {
// [self setFetchPredicate:[NSPredicate predicateWithFormat:@"pending == YES"]];
[self setFilterPredicate:[NSPredicate predicateWithFormat:@"pending == YES"]];
}