保存前创建对象的iOS模式?

Posted

技术标签:

【中文标题】保存前创建对象的iOS模式?【英文标题】:iOS patterns for creating object before saving? 【发布时间】:2012-06-10 06:45:04 【问题描述】:

我是 ios 新手,目前正在为我的应用设计“创建新活动”页面。

一些信息:

    用户可以单击创建新事件,然后按返回以取消创建此新事件。 (我正在使用 UINavigationController) 可以将 1 个视频附加到特定事件。 用户可以创建一个新事件,录制一个视频,然后决定不继续保存它(按返回键) 每个事件都必须生成一个 uuid。需要此 uuid 以防止不同客户端之间创建事件并将它们提交给服务器之间的实体冲突。 捕获的每个视频都被命名为 uuid.mov,以便在事件上传到服务器之前存储到文件系统中。

来自rails背景,我习惯做以下事情:

    当用户单击“创建新事件页面”时,会创建一个事件但不会保存到数据库中。 然后用户在页面中输入属性并决定他/她是否要提交 当提交发生时,事件会被赋予所提供的信息。然后保存该事件。

但是,我不相信 Core Data 有一个 API 可以让开发人员在不保存实体的情况下创建实体。目前,我正在做这样的事情:

    当用户访问“创建新事件页面”时,会创建一个空对象并将其存储到数据库中。对事件实例的引用被传递给创建新事件页面的控制器。 当用户输入所有信息并拍摄视频时(uuid 是在 awakeFromInsert 中创建并在 1 期间设置的),保存只是设置具有所需属性的实体。 如果用户决定取消创建事件,我正在检查是否按下了取消。如果是,则事件和视频文件都将被删除。

检查是否按下取消的代码。

- (void)viewWillDisappear:(BOOL)animated 
    [super viewWillDisappear:animated];
    if (![[self.navigationController viewControllers] containsObject:self]) 

说实话,这有点复杂。大家有更好的建议吗?

【问题讨论】:

【参考方案1】:

它实际上就像你描述的 Rails 工作的那样工作:新对象在你提交它们之前不会保存到持久存储中(通过NSManagedObjectContextsave: 方法)。

查看Core Data Programming Guide 的Creating and Deleting Managed Objects section。摘录...

仅仅创建一个托管对象不会导致它被保存到一个 持久存储。托管对象上下文充当暂存器。你 可以用它创建和注册对象,对对象进行更改, 并根据需要撤消和重做更改。如果您更改托管 与给定上下文关联的对象,这些更改仍然是本地的 该上下文直到您通过发送上下文 a 来提交更改 保存:消息。那时——前提是没有验证 错误 - 更改已提交到存储。

【讨论】:

要补充一点,如果你想创建一个永远不会保存到你的主对象上下文的对象,你可以创建一个“便签本”或一个新的 NSManagedObject 上下文,你可以对其进行更改和然后要么丢弃它,要么你可以将对象复制到你的主 NSManagedObjectContext

以上是关于保存前创建对象的iOS模式?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 工厂模式

iOS 设计模式之工厂模式

在同一集合中创建对象的 mongodb 模式数组或创建新集合的更好方法保存引用

iOS:如何保存在应用程序中创建的自定义对象

创建新模式对象后,Mongoose 引用的字段丢失

用保存前已存在的对象交换对象