0

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;
}
4

1 に答える 1

2

ドキュメントから:

検証方法はモデルの決定であり、いつ検証するかはユーザー インターフェイスまたはコントローラー レベルの決定であることを理解することが重要です (たとえば、テキスト フィールドの値バインディングでは、「すぐに検証する」オプションが有効になっている場合があります)。

また:

メモリ内オブジェクトが一時的に不整合になることを禁止するものは何もありません。検証の制約は、「保存」操作中または要求時にのみ Core Data によって適用されます (必要に応じて検証メソッドを直接呼び出すことができます)。変更が行われるとすぐに検証し、エラーをすぐに報告すると便利な場合があります。

彼らが「検証メソッドを直接呼び出すことができる」と言っている場合、プロパティ固有の検証メソッドを実際に呼び出す必要があることを意味しているとは思わないことに注意してください。その直後にメモがあります。

重要:カスタム検証メソッドを実装する場合は、通常、それらを直接呼び出すべきではありません。代わりに、validateValue:forKey:error: を適切なキーで呼び出す必要があります。これにより、管理オブジェクト モデルで定義されたすべての制約も確実に適用されます。

したがって、コンテキストが保存されたときにのみ検証メソッドが呼び出されるという事実は驚くべきことではありません。それは、Core Data がその検証を行うときです。とはいえ、より頻繁に検証することは自由であり、それを行うことを選択した場合は、 を呼び出して行う必要があります-validateValue:forKey:error:

于 2013-09-18T14:09:17.503 に答える