Core Data 属性的自定义 Getter

Posted

技术标签:

【中文标题】Core Data 属性的自定义 Getter【英文标题】:Custom Getter for Core Data attribute 【发布时间】:2013-02-27 20:44:36 【问题描述】:

我在我的应用程序中引入了软删除模式。我不会从我的上下文中删除对象,而是将它们标记为“已删除”。我将在这里使用从食谱中(软)删除成分的示例。

我在很多地方都要求提供食谱的成分。如果可能的话,我想避免更新所有这些(并且可能会丢失一个)。相反,我可以为配方类重新定义 ingredients getter,我将在其中过滤掉软删除的对象吗?

我需要完整成分列表(包括软删除)的少数情况将使用新属性,例如 ingredientsIncludingDeleted

这合理吗?使用自定义 getter 是否有任何明显的副作用,而不仅仅是返回预期的内容?我应该注意什么特定的核心数据?

【问题讨论】:

我将重命名核心数据属性;或为未删除的成分使用不同名称的访问器。托管对象属性的访问器应该只返回属性的值 - 否则 KVC 将被破坏。 【参考方案1】:

是的,您可以这样做。但是,您的方法是倒退。 默认的 getter 不应该有任何谓词。它应该完全按照它的含义去做,这是一个未过滤的结果集。想想有人在 6 个月后阅读您的代码。他们会知道“成分”实际上意味着“过滤的成分”吗?没有。

因此,与其改变 default getter 的含义,不如创建一个新的 getter(命名为“filteredIngredients”,并在任何地方使用它。这是正确的长期解决方案。

如果您担心忘记更改某些地方的属性,请执行以下操作:暂时将您的成分吸气剂重命名为其他名称,例如“tempIngredients”。这将在任何使用它的地方导致编译器错误。使用适当的 getter 修复所有这些编译器错误,然后将默认 getter 重命名为“ingredients”。

希望这会有所帮助。

【讨论】:

谢谢。感觉不对,我必须承认。重命名的想法也不错。 与其重命名 getter 并创建编译器错误并阻止您的应用程序运行,不如将 __attribute__((deprecated)) 添加到您的 getter 定义中。这将产生警告,但会使应用程序保持可运行状态。 我同意@melsam,但就我而言,我在 Category 中创建了一个新方法,该方法从默认 getter 获取数据。最后我返回过滤后的数据。

以上是关于Core Data 属性的自定义 Getter的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 自定义访问器甚至没有被调用

具有自定义子组件的自定义 Blazor 组件

插入时不调用 Core Data 的自定义验证方法

Core Data 关系的自定义设置器以强制反向互惠关系

在 Core Data 中保存一组自定义类

js自定data-*和jquery的data()用法