Ios 核心数据更改值是否忽略二进制数据和转换的属性?

Ios 核心数据更改值是否忽略二进制数据和转换的属性?,ios,core-data,entity,Ios,Core Data,Entity,在保存上下文之前,我通过changedValues评估核心数据实体,以便对托管对象进行其他更改。在我的例子中,我有一些非平凡的计算,这些计算只有在对象真正发生变化时才相关 我将一个属性更改为二进制数据,并添加了一个转换器来存储字典数据。changedValues方法始终返回nil字典或不带此属性的字典 更改文档中的值: 返回值 一种字典,其中包含自上次获取或保存接收方以来已更改的持久属性的名称作为键,以及属性的新值作为值 讨论 此方法仅报告对定义为接收器持久属性的属性的更改,而不报告对瞬态属性或

在保存上下文之前,我通过
changedValues
评估核心数据实体,以便对托管对象进行其他更改。在我的例子中,我有一些非平凡的计算,这些计算只有在对象真正发生变化时才相关

我将一个属性更改为二进制数据,并添加了一个转换器来存储字典数据。
changedValues
方法始终返回nil字典或不带此属性的字典

更改文档中的值:

返回值 一种字典,其中包含自上次获取或保存接收方以来已更改的持久属性的名称作为键,以及属性的新值作为值

讨论 此方法仅报告对定义为接收器持久属性的属性的更改,而不报告对瞬态属性或自定义实例变量的更改。此方法不会不必要地引发关系错误

changedvalue
是否不返回转换属性的值?当我存储图像之类的东西时,我看到ChangedValue在字典中返回二进制数据属性名

我在文档中没有找到有关字典中返回的有效实体属性的信息

确定托管对象是否已修改的最佳实践是什么

谢谢

更新: 下面是我用来将字典存储为二进制对象的转换器:

@implementation DictionaryToData
+ (BOOL)allowsReverseTransformation
{
    return YES;
}

+ (Class)transformedValueClass {
    return [NSDictionary class];
}

- (id)transformedValue:(id)value {
    return [NSKeyedArchiver archivedDataWithRootObject:value];
}

- (id)reverseTransformedValue:(id)value {
    return [NSKeyedUnarchiver unarchiveObjectWithData:value];
}

@end

NSDictionary不包含二进制文件。您必须单独获取二进制文件(而不是在字典中)并手动对其进行转换。

在实现访问器时,需要围绕基本访问调用
willAccessValueForKey:
didAccessValueForKey:


同样,在实现setter时,您需要围绕您的基本setter调用
willChangeValueForKey:
didChangeValueForKey:

NSDictionary
可以包含任何对象,例如
NSData
。嗯,我昨天刚刚读过这篇文章。与词典相关的内容不能包含NSData。我将进行调查,因为我一定把指令弄混了。@DSMagic,我在将NSDictionary转换为二进制数据/从二进制数据转换为NSDictionary时没有遇到问题。我的问题是,当通过转换器更改属性时,核心数据不会使用changedValues将其列为已修改的属性,以获取已更改值的字典。我希望它包括所有属性,而不管类型如何。你能添加一些关于你正在转换什么数据以及如何进行转换的信息吗?@Tom,我为我的转换器添加了代码。没什么特别的,只是从二进制数据到/从二进制数据。有趣的是,我检查了托管对象的isUpdated属性并设置了它。@Tom,我检查了托管对象的isUpdated属性并设置了它。另一个奇怪的观察结果是,通过该转换器更改属性也不会被我的undoManager使用。好的,作为测试,我移除了该转换器,并亲自使用NSKeyedArchiver、NSKeyedUnachiver将数据转换为核心数据或从核心数据转换为核心数据。现在核心数据知道了这一变化,我的撤销管理器又开始工作了。这毫无意义,我也找不到这种行为的文档。有人能证实这一点吗?我所知道的转换器可能失败的唯一原因是,如果字典包含不可归档的对象(即不符合
NSCoding
)。假设您两次都使用相同的数据,手动存档也会失败。这是事实,但与值转换器的问题完全无关。我补充说,因为
NSDictionary
符合
NSCoder
,这意味着您根本不需要自定义转换器。。。OP提供的代码是一个有效的转换器实现。所以,一定是别的原因。。。如果它是一个有效的字典,一种不获取
changedvalue
的方法是使用自定义setter实现,并且忘记调用KVC willChange/didChange方法。可能应该是一个评论而不是一个答案。