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

Posted

技术标签:

【中文标题】用保存前已存在的对象交换对象【英文标题】:Swapping out an object for one that already exists before save 【发布时间】:2014-06-23 14:09:28 【问题描述】:

是否有可能在使用 Parse 时拥有一个 beforeSave 云函数,它不仅会修改正在保存的对象,还会将其换成全新的对象。

示例...

我正在创建一个消息应用程序,它使用自定义表情符号作为消息的一部分。

表情符号的图像都存储在设备本地(旁边有一个 plist 以引用它们)。

所以,我在 Parse 中有一个 Message 表,其中包含指向 Emoji 表的指针数组。

Emoji 表只有一个imageName 条目,因此我存储的所有数据足以在所有设备上显示相同的图像。我不想上传和下载数百张图片。

所以,我现在遇到的问题是,如果 15 个不同的人都创建带有“笑脸”表情符号的消息,那么我在表格中有 15 个“笑脸”Emoji 对象,但它们本质上是相同的。

我想做的是有一个云代码before save 函数,它会查看表情符号并找到一个相同的。如果它没有找到打开的,那很好,因为它只会创建一个新的,但如果是这样,它应该使用现有的而不是创建一个副本。

当我创建消息时,我会一次性完成所有操作。我创建message 对象并添加emoji 对象数组,然后在message 上运行后台保存(这也保存了孩子)。

我还没有任何代码,因为我真的不是 JS 开发人员,所以我不想开始破解。不过能得到一些指导会很好。

【问题讨论】:

您是在 Emoji 表中创建新行,还是在保存消息时仅指向现有行?如果有,这些记录有何独特之处? @RyanDuffy 创建新行。只是因为我不想因为不需要而必须全部下载它们。我实际上一直在考虑删除表格并在文本中“编码”数组。唯一字段实际上是一个组合。 type 字段加上 imageNameuser(指向 PFUser 的指针)或 date 在文本中编码它们可能是一个更简单的解决方案。听起来您不需要在 Parse 中维护 Message 和 Emoji 之间的关系,但我确信您没有在帖子中分享您的所有要求。我会尝试回答你的问题,看看会发生什么。 :) @RyanDuffy 谢谢,我认为你是对的。是的,我真的不需要它作为一种关系。将其编码为文本实际上是我最初所做的,然后更改为这种方式。我认为坚持我最初的文本编码想法可能更明智。 【参考方案1】:

您不能“重定向”beforeSave 中的对象,因此我试图保存一个对象并默默地更新另一个对象。您可以在 beforeSave 期间更新另一个对象,但为了防止保存新对象,您必须使该操作失败,这听起来不像您想要做的。

您可以将beforeSave 挂钩添加到Message 以更新指向Emoji 的指针。但是,在您的情况下,这不会阻止创建 Emoji 中的新记录,因为必须先创建这些记录才能从 Message 创建指针。

如果您真的需要 Parse 中从 Message 到使用的 Emojis 的指针并且您只需要系统中每个 Emoji 的一条记录,您可以:

在启动时检索所有 Emoji 记录(并可能在本地缓存它们)并在创建新消息时将它们作为指针添加

使用云代码函数创建消息,您可以在其中根据参数或消息内容查找Emoji

【讨论】:

感谢您的回答。第二种选择听起来很有趣。我什至没有想过要做那样的事情。现在我要回到我的文本编码系统。但我会在未来牢记第二种选择。谢谢【参考方案2】:

IMO 您的消息表条目可以使用指针(指向一个或多个解析文件)。

每个指针的详细信息...

"toEmoji":"__type":"File","name":"9d74eb8e-11bd-4bd0-9146-bc01c6656daa-......jpg","url":"http://files.parse.com/09d82830-ec2d-40b4-bb14-944728550685/9d74eb8e-11bd-4bd0-9146-bc01c6656daa-.......jpg"

因此,在对任何文件执行 POST 操作以上传新表情符号之前,请运行您的进程以查找现有的 DUPE。

onDupe() 可以返回与要解析的文件 POST 返回的相同签名... 即 "fileName": "", "fileUrl": ""

然后它有点独立(不知道用作新消息指针目标的属性值是指向现有文件还是指向新文件)。

【讨论】:

谢谢,我没想到会做这样的事情。我一定会考虑的。

以上是关于用保存前已存在的对象交换对象的主要内容,如果未能解决你的问题,请参考以下文章

条款04:确定对象使用前已被初始化

条款04 确定对象被使用前已先被初始化

条款04:确定对象被使用前已被初始化

条款4:确定对象被使用前已被初始化

NO.4: 确定对象被使用前已被初始化

使用Bundle在Activity之间交换数据