我创建了一个Core Data模型并创建了一个类别类,其中包含更新和删除数据的方法。我正在尝试向类中添加验证方法并尝试使用KVC但是稍微挣扎。
我的问题是这个,我的验证方法仅在我实际保存上下文[context save:& internalError]时触发,它们工作正常但保存过程也完成了。我的问题是,触发验证的时间是什么时候可以在保存之前触发,还是我完全错了?
我的代码:
+(int)doSmeThing:(InstructionMessageObject *)message inManagedObjectContext:(NSManagedObjectContext *)context error:(NSError **)error {
NSError *internalError = nil;
int timeStamp = [[NSDate date] timeIntervalSince1970];
NSManagedObject *newMessageObject = [NSEntityDescription insertNewObjectForEntityForName:@"CoreDataTable"inManagedObjectContext:context];
[newMessageObject setValue:message.productCode forKey:@"productCode"];
[newMessageObject setValue:message.quantity forKey:@"quantity"];
///////////////////////////////////////
// Need to validate HERE before save //
///////////////////////////////////////
if (![context save:&internalError]) {
*error = internalError;
return NO;
}
return YES;
}
- (BOOL)validateProductCode:(id *)ioValue error:(NSError **)outError {
*outError = nil;
if ([*ioValue integerValue] < 1 ) {
*outError = [NSError errorWithDomain:@"domain" code:101 userInfo:[NSDictionary dictionaryWithObject:@"Invalid Product Code" forKey:NSLocalizedDescriptionKey]];
return NO;
}
return YES;
}
- (BOOL)validateQuantity:(id *)ioValue error:(NSError **)outError {
*outError = nil;
if ([*ioValue integerValue] < 1 ) {
*outError = [NSError errorWithDomain:@"domain" code:102 userInfo:[NSDictionary dictionaryWithObject:@"Invalid Quantity" forKey:NSLocalizedDescriptionKey]];
return NO;
}
return YES;
}
答案 0 :(得分:2)
来自the docs:
了解如何验证是一种模型非常重要 决定,何时验证是用户界面或控制器级别 决定(例如,文本字段的值绑定可能具有它 “立即验证”选项已启用)。
还有:
没有什么可以禁止内存中的对象成为 暂时不一致。验证约束是 仅在“保存”操作期间或根据请求由Core Data应用 (您可以根据需要直接调用验证方法)。 有时,尽快验证更改可能很有用 制作并立即报告错误。
请注意,当他们说“您可以直接调用验证方法”时,我认为它们并不意味着您应该实际调用特定于属性的验证方法,因为在此之后会有一个注释:
重要提示:如果您确实实现了自定义验证方法,则通常不应直接调用它们。相反,你应该打电话 validateValue:forKey:error:使用适当的密钥。这确保了 管理对象模型中定义的任何约束也是 应用
因此,只有在保存上下文时调用验证方法这一事实并不令人惊讶 - 这就是Core Data进行验证的时候。也就是说,您可以更频繁地进行验证,如果您选择这样做,则应通过拨打-validateValue:forKey:error:
进行验证。