解释核心数据验证消息并在iPhone上显示它们有什么好的模式?

Sco*_*ttS 9 iphone validation design-patterns core-data

我已经使用Core Data实现了一个小概念验证应用程序,通过文本字段接受用户的一些对象属性值,并且由于此处和iPhone Core Data Recipes应用程序中的信息,它们都运行良好.但我现在需要向用户显示对象验证错误,我找不到推荐的处理方法.Recipe应用程序中的代码只记录错误并说"用代码替换此实现以适当地处理错误".十分感谢.

我敢肯定有很多方法来解释,分析和验证错误信息发送给用户,但我想知道的是,如果有一些最佳做法或有人实施了,我可以遵循一个模式,众说纷纭.验证码[newObject valdiateForInsert&error];应该放在哪里?在NSManagedObject子类中?在处理屏幕的UIViewController中,是否允许添加对象?也许在app范围内的ValidationController?

所有验证错误都在NSError的用户信息,这是各种NSValidation键和值的NSDictionary的返回.有没有一种很好的方法可以将此错误信息转换为对用户有帮助的内容?例如,我的核心数据模型中有一条规则,某个属性只能是3个字符.如果在保存或更新一个对象,我得到验证错误的过程中,我需要解析出NSError用户信息,并找到值的NSValidationErrorKey(属性的名称)时,NSValidationErrorValue(导致错误的对象的值)和NSValidationErrorPredicate(违反的规则,在这种情况下返回length <= 3.

有没有可以传回给用户一个良好的,普遍接受的收集和这个数据改写(munging)弄成的呢?目前,我正在拉NSError信息为字符串,然后通过一系列针对我验证每个属性的条件语句的下降,它是如此丑陋,我还挺想,当我看着它想吐.必须有一种更好,更清晰的方式来使用Core Data验证错误并将可读版本传递给用户.

Tec*_*Zen 7

用户没有验证.它们在那里,因此代码可以保持对象图的完整性.在保存上下文之前,托管对象上下文不会调用验证方法.那段时间可能与输入时间相距甚远.

但是,您可以在设置属性之前直接调用对象验证方法.验证方法的形式如下:

- (BOOL)validateTimeStamp:(id *)valueRef error:(NSError **)outError;
Run Code Online (Sandbox Code Playgroud)

假设您具有name托管对象子类的属性PeopleMO.检查空字符串的验证方法可能如下所示:

- (BOOL)validateName:(id *)valueRef error:(NSError **)outError{
    BOOL isValid=NO;
    NSString *toTest=(NSString *) valueRef;
    if (![toTest isEqualToString:@""]) {
        isValid=YES;
    }
    return isValid;
}
Run Code Online (Sandbox Code Playgroud)

您可以在任何地方调用它:

NSString *newName=// some UI element text 
PersonMO *newPerson=//.. insert new PersonMO object
if ([newPerson validateName:newName error:nil]) {
    newPerson.name=newName;
}else{
    //... inform user name is invalid
    // ... possibly delete newPerson object from context
}
Run Code Online (Sandbox Code Playgroud)

如果您遇到一个属性的值的有效性取决于同一对象的一个​​或多个其他属性的情况,这将非常有用.