【问题标题】:Why would I use a transient attribute to represent a derived read only property in core data?为什么我要使用瞬态属性来表示核心数据中的派生只读属性?
【发布时间】:2011-12-18 22:02:51
【问题描述】:

如果它是只读的,是否有任何理由为派生属性建模瞬态属性?在我的自定义类中声明一个属性,然后动态计算 getter 中的值似乎要容易得多。我会将其与 keyPathsForValuesAffecting 结合起来,以通知观察者有关更改。 如果我需要缓存,我只需为该属性添加一个 ivar 并在其中一个基础值更改时重置它(如this 问题的答案中所建议的那样)。

将其建模为瞬态属性会有什么好处吗?

【问题讨论】:

    标签: core-data transient


    【解决方案1】:

    事实上,我正在做这件事,因为核心数据编程指南中的这句话,“考虑一个应用程序,其中有一个具有 firstName 和 lastName 属性的 Person 实体,以及一个缓存的瞬态派生属性 fullName”。这就是我相信我想到这将是一件好事的地方。

    然而,它接着说,“(实际上可能不太可能缓存 fullName 属性,但这个例子很容易理解)。”,让我知道这确实只是他们所描述的示例,但可能不是很好的实现。

    因此,在阅读了有关瞬态属性及其预期用途的更多信息后,我意识到这可能是一种糟糕的使用方式。为我的实现缓存它没有任何好处。我确实喜欢使用“点”表示法(因为它是一个属性)而不是向对象发送消息的能力,但我不相信使用它会带来任何性能提升。

    更重要的是,我认为将其作为托管对象上下文必须跟踪的属性的开销实际上是一件坏事。

    所以,我将重构我的应用程序,现在在我的 managedObject 实体的子类上创建这些简单的实例方法,并且只返回结果,因为我认为将它们设置为瞬态属性并没有真正的好处。

    使用其中之一的原因是,当您实际需要保留不适合其中一种 managedObject 类型的内容时。但是,您基本上会创建两个属性。一种是瞬态的,是您的对象的真实表示,您为此编写 getter 和 setter,另一种很可能是二进制数据类型,仅由核心数据实体子类在内部用于持久化其他对象的值(s) 在存储对象中。

    至少这是我对这一切如何运作的理解。如果我有任何错误,欢迎发表评论,因为这对我来说也很困惑。

    【讨论】:

    • 谢谢。我正在四处寻找关于“瞬态属性”和“派生属性”的解释。你帮助我理解了这一点。我同意大多数情况下的用例是:“使用其中之一的原因是,当您实际上需要保留不适合其中一种 managedObject 类型的东西时。”
    猜你喜欢
    • 2013-05-20
    • 2014-11-26
    • 2011-06-17
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2013-10-03
    • 2019-09-08
    • 2013-09-10
    相关资源
    最近更新 更多