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的主要内容,如果未能解决你的问题,请参考以下文章