【问题标题】:Difference between transient and derived properties of a core data entity核心数据实体的瞬态属性和派生属性之间的区别
【发布时间】:2014-11-26 23:35:02
【问题描述】:

核心数据实体的瞬态属性和派生属性有什么区别?我想创建一个“虚拟”属性,可用于获取操作以从核心数据实体返回本地化的国家/地区名称。

操作是这样进行的:

  1. 从数据库中检索英文国家名称
  2. 执行 NSLocalizedString(countryNameInEnglish, nil) 以获取本地化的国家/地区名称。

2 是由这个“虚拟”属性来完成的。

我应该使用哪一个?瞬态或派生,我该怎么做?

我没有什么可以给你看,因为我不知道我应该使用什么。

谢谢

【问题讨论】:

    标签: ios cocoa-touch core-data nsmanagedobject nsfetchedresultscontroller


    【解决方案1】:

    根据 Apple 的Non-Standard Persistent Attributes 指南:

    您可以将非标准类型用于持久属性,方法是使用可转换属性或使用瞬态属性来表示受支持的持久属性支持的非标准属性。这两种方法背后的原理是相同的:您向实体的消费者提供您想要的类型的属性,然后“在幕后”将其转换为 Core Data 可以管理的类型。这两种方法之间的区别在于,对于可转换的属性,您只需指定一个属性,并且会自动处理转换。相反,对于瞬态属性,您需要指定两个属性,并且您必须编写代码来执行转换。

    我建议使用瞬态属性。想法是您创建 2 个字符串属性:countryName(非瞬态)和localizedCountryName(瞬态):

    然后,在您的 NSManagedObjectSubclass 中,您只需为本地化国家名称实现一个 getter:

    - (NSString *)localizedCountryName
    {
        NSString *result;
    
        if ([self.countryName length] > 0) {
            result = NSLocalizedString(self.countryName, nil);
        }
    
        return result;
    }
    

    【讨论】:

    • localizedCountryName 是否每次都计算?
    • 嗯,它是一个临时属性,所以它不存储在数据库中。每次调用localizedCountryName时都会计算,但你可以添加一些ivar或其他方式只计算一次,然后返回存储的值
    • @A.S.如果我只实现 getter,我的代码也可以。为什么要创建瞬态属性?
    • @Daedelus 在这种情况下没有必要。但是如果你需要创建一个属性来分类并在不同的上下文中使用它,那么你需要使用瞬态属性。
    • 在这种情况下,localizedCountryName 是派生属性而不是瞬态属性。 developer.apple.com/library/archive/documentation/Cocoa/…
    猜你喜欢
    • 2011-06-17
    • 2013-05-20
    • 2013-06-26
    • 1970-01-01
    • 2014-11-26
    • 2011-12-18
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多