在将来自服务器的对象存储到Core Data之前更新对象的正确方法是什么?我有一个具有“本地”属性的类,我必须在存储之前更新它。
我的模特中有一个班级
@interface classA : NSManagedObject {}
@property (nonatomic, strong) NSNumber* customAttribute;
@end
值customAttribute
不在JSON中,在将对象存储在CD中之前必须为其分配一个特殊值。我在UITableView
中显示了JSON内容,但在通知NSFetchedResultsController
之前,我需要初始化值customAttribute
。
更新:一种可能的解决方案是使用Key Value Validation:
我以这种方式使用了验证方法:
- (BOOL)validateEntityId:(inout __autoreleasing id *)ioValue error:(out NSError *__autoreleasing *)outError {
self.customAttribute = [[AppConfiguration sharedInstance].sortIndexes objectForKey:*ioValue];
if(self.customAttribute == nil) {
self.customAttribute = @(9999);
}
return YES;
}
但是当我运行应用程序时,我得到了这个例外:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'在保存之前无法处理挂起的更改。 1000次尝试后,上下文仍然很脏。通常,这种递归弄脏是由错误的验证方法-willSave或通知处理程序引起的。
我还从映射中排除了customAttribute
属性。但我仍然得到例外。 (映射排除/包含与解决方案无关。)
更新2:
验证方法应仅为*ioValue
指定值。它不应该更改类或超类中的任何其他值,但它可以从不同的已初始化的类属性中分配值。
答案 0 :(得分:1)
KVC验证方法应该有效,您只需确保在您不做(或不应该)进行更改时,通过触发更改通知,您不会总是弄脏对象。
目前您的代码:
self.customAttribute = [[AppConfiguration sharedInstance].sortIndexes objectForKey:*ioValue];
if(self.customAttribute == nil) {
self.customAttribute = @(9999);
}
始终设置self.customAttribute
,它会触发更改通知,然后将其读回,从而触发更多通知,然后再次设置更多通知,然后再发送更多通知。
更改此选项以使用基元访问器检查是否需要进行更改。如果新值等于当前值,或者您要将其设置为nil,然后再将其设置为其他值,请先将其设置为当前值。然后,一旦你知道要做什么改变 - ,如果有的话 - 做吧。
大多数情况下,关键是如果你能帮助它就不要做出改变,因为重复的改变是为什么你得到一个对象仍然很脏的循环......