核心数据直接在代码中获取/设置属性时,不会自动调用值转换器

如果我理解正确,核心数据可转换属性背后的想法是:

  1. +transformedValueClass实现一个带有返回[NSData class]NSValueTransformer[NSData class]以及用于转换的实现
  2. +load+initialize注册变压器
  3. 将实体的属性设置为可转换的
  4. 在xcode模型编辑器中为属性设置您的转换器的名称(您用来注册它的名称)。

在这一点上,我期望访问或设置适当的实体types的managedObject属性将触发值转换器。 但是,我正在使用AFIncrementalStore的应用程序中testing这个,我得到以下行为:

  • A – 在+load+initialize中注册变压器似乎没有必要; 核心数据无论如何发现它(虽然提前阅读)。
  • B – 通过AFIncrementalStore获取请求AFIncrementalStore会触发变压器。 例如,我从获取请求中获取JSON,并将响应字典映射到managedObject时,转换器被触发,并将合适的字典密钥转换为对象中的NSData
  • C – 但是,如果我尝试通过代码设置或获取属性,则不会调用变换器。 这就是像myManagedObject.myAttribute = @"hello"不会触发从NSStringNSData的转换, NSString *myString = myManagedObject.myAttribute也不会触发从NSDataNSString的转换。

那么我错过了什么? 我认为这个想法是CoreData会自动调用变压器。 我错了吗?

根据这个问题: 为什么我的可变形的核心数据属性不使用我的自定义NSValueTransformer? 这似乎是苹果框架中的一个错误。 但是,抛出我的是通过AFIncrementalStore值变换器调用。 也许关键是通过代码设置一个属性我不是真的触发AFIncrementalStore,所以更改只是在内存中?

(从上面的注释:) 保存上下文时调用逆转换器,而不是在设置属性时调用。