0

Core Data を使用するアプリがあり、UIManagedObject を使用してその ManagedObjectContext を取得します。読んだところ、コンテキストを直接保存することを想定していないことがわかりました-むしろ、UIManagedObject の自動保存に依存するか、saveToURL を使用する必要があります:... 私の問題は、エンティティに格納されているデータを検証することです。文字列プロパティの最小長が 1 であることを指定するエンティティに制約があります。ただし、新しいオブジェクトを作成し、そのプロパティに空の文字列を割り当てて、ファイルを保存することはできます。saveToURL:... の完了ハンドラーでは、常に真の成功値があります。次に、エンティティの name プロパティ用に独自のバリデータを作成しました。Core Data Programming Guide のサンプルコードを使用しました -

-(BOOL)validateName:(id *)ioValue error:(__autoreleasing NSError **)outError 

{
    if (*ioValue == nil) 

    {
        if (outError != NULL) 

        {
            NSString *errorStr = @"nil error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        }

        return NO;

    }

    else if( [*ioValue length] == 0 )

    {

        if (outError != NULL) {

            NSString *errorStr = @"length error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        }

        return NO;

    }

    else

    {

        return YES;

    }

}

これを実行すると、ioValue の長さが 0 で、NO が返されることがわかりますが、完了ハンドラが呼び出されません。どんな助けでも素晴らしいでしょう。

UIManagedDocument でエラーの保存を処理する方法、特に情報の保存中にエラーが発生したことを呼び出し元のコードに通知する方法に欠けているものはありますか。

4

2 に答える 2

0

原則として、saveToURLを呼び出すだけで、新しいファイルを作成できます。残りは自動保存します。

また、私はあなたの質問に従うかどうかわかりません。保存の失敗について知る方法を尋ねている場合、あなたができる最善のことは通知に登録することです(すべての保存はバックグラウンドスレッドで行われるため)。

ドキュメントから直接:

UIDocumentオブジェクトには、ライフサイクルの任意の時点で特定の状態があります。documentStateプロパティをクエリすると、現在の状態を確認できます。また、UIDocumentStateChangedNotification通知を監視することで、ドキュメントの状態の変化を通知できます。

于 2012-04-17T23:52:24.560 に答える
0

handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermittedUIManagedDocument のサブクラスに実装する必要があると思います。私はこの記事を介してそれを見つけました - http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

于 2012-11-13T19:15:28.083 に答える