【问题标题】:CoreData ValueTransformer.transformedValueClass() is never called in Swift 3CoreData ValueTransformer.transformedValueClass() 在 Swift 3 中从未被调用
【发布时间】:2017-03-12 16:58:05
【问题描述】:

我有一个 ValueTransformer 子类,它可以将日期转换为字符串以在 Core Data 中保留日期的原始时区。

transformedValuereverseTransformedValue 都按预期调用,但没有调用类 func transformedValueClass()

我猜 ValueTransformer 默认使用 NSData,因为我在保存后尝试保留值时收到的错误消息是:

[__NSCFString bytes]: 无法识别的选择器发送到实例

以下是我的代码的相关位:

@objc(DateValueTransformer)
class DateValueTransformer: ValueTransformer {

    private let formatter = DateFormatterCache.sharedInstance.formatterWithFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ")

    override class func transformedValueClass() -> AnyClass {
        print("Anybody home??? Never called...")
        return NSDate.self
    }

    override func transformedValue(_ value: Any?) -> Any? {
        guard let date = value as? Date else {
            return nil
        }

        return formatter.string(from: date)
    }

    override func reverseTransformedValue(_ value: Any?) -> Any? {
        guard let dateString = value as? String else {
            return nil
        }

        return formatter.date(from: dateString)
    }
}

这是在 CoreData 中注册 ValueTransformer 的方式:

【问题讨论】:

  • 你能显示调用你的类的代码吗?
  • 当您在 xcdatamodel 文件中设置 ValueTransformer 时,CoreData 会在内部调用此类。没有显式调用此类的用户代码。
  • @jimj 类函数被称为 -: (classname.methodname)。这里的类名是您在其中创建方法的类的名称。例如:DateValueTransformer.transformedValueClass()。
  • @TusharSharma 我不确定我是否理解您的观点。这是一个重写的静态函数,应该由 CoreData 自动调用。我没有直接调用这个方法。
  • @jimj 我没用过,但这可能会有所帮助-:googleweblight.com/i?u=http://bluelemonbits.com/index.php/2016/…

标签: ios swift core-data


【解决方案1】:

显然,Core Data 只支持转换为 NSData。我在 Core Data 编程指南中找不到这方面的原始文档,但经过大量搜索,其他用户也遇到了同样的问题。

可转换属性背后的想法是,您可以访问 属性作为非标准类型,但在 Core Data 背后使用 NSValueTransformer 的一个实例,用于将属性转换为和从 NSData 的一个实例。然后,Core Data 将数据实例存储到 持久存储。

默认情况下,Core Data 使用 NSKeyedUnarchiveFromDataTransformerName 变压器,但是您可以根据需要指定自己的变压器。 如果你指定一个自定义转换器,它必须转换一个实例 将非标准数据类型转化为 NSData 实例并支持 反向转换。如果您正在使用,则不应指定名称 默认转换器。

【讨论】:

    【解决方案2】:

    transformedValue 函数希望您以可以保存在文件系统上的格式返回一个对象,您返回的是 String 对象,它不是可以存储它的类型,如果您返回这个

    override func transformedValue(_ value: Any?) -> Any? {
    
        if let value = value {
    
            return NSKeyedArchiver.archivedData(withRootObject: (value))
    
        }
    
        return nil
    }
    

    它将起作用,因为它将返回值的编码形式,在您的情况下是日期。

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 2018-07-31
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多