5

Core Data での一時的なプロパティの設定に問題があります。私が解決しようとしている問題は次のとおりです。Core Data を使用して正常に格納されたオブジェクトのコレクションがあります。このコレクションは基本的に読み取り専用のコレクションですが、実行時に別のオブジェクト (この場合は UIImage) をコレクション内の各アイテムに関連付けたいと考えています。UIImages を保存する必要はありません。これは純粋に実行時の関連付けです。したがって、私が本当に必要としているのは、後で UIImage をドロップできるコレクション内の各オブジェクトの「プレースホルダー」です。

一時的な属性は正しいことのように思えます。このため、Core Data リファレンス ドキュメントでは、データ モデルに「未定義のオプションの一時的な属性」を設定する必要があると書かれています。 XCode スニペット

さらに、実装オブジェクトで対応するプロパティを定義する必要はありませんが、カスタム アクセサーとセッター メソッドを記述する必要があることがわかります。次のように、ドキュメントの例に基づいてこれらのメソッドをモデル化しました。

- (void)setDisplayImage:(UIImage *)anImage {

    [self willChangeValueForKey:@"displayImage"];
    [self setPrimitiveValue:anImage forKey:@"displayImage"];
    [self didChangeValueForKey:@"displayImage"];
}

と:

- (UIImage *)displayImage {

    [self willAccessValueForKey:@"displayImage"];
    UIImage *anImage = [self primitiveDisplayImage];
    [self didAccessValueForKey:@"displayImage"];

    if (anImage == nil) {       
        NSData *displayImageData = [self displayImageData];
        if (displayImageData != nil) {
            anImage = [NSKeyedUnarchiver unarchiveObjectWithData:displayImageData];
            [self setPrimitiveDisplayImage:anImage];
        }
    }
    return anImage;
}

上記のように、これらのオブジェクトをストアに書き戻すことはありませんが、厳密に完全を期すために作成した遅延「書き込み」メソッド (willSave) もあります。

私が得ている問題は、 - (UIImage *)displayImage { のprimitiveDisplayImageおよびsetPrimitiveDisplayImageメソッドにあります。基本的に、コンパイラはこれらの 2 つのメソッドに対して、「オブジェクト X が 'primitiveDisplayImage' に応答しない可能性があります..」などの警告をスローします。ケース。この問題を解決するのを手伝ってくれる人はいますか? どうもありがとう

4

2 に答える 2

5

メソッドの問題setPrimitive...は、実行時に NSManagedObject がメソッドに応答するものの、コンパイラがそれらの存在を知る方法がないことです。カテゴリを使用して、エンティティ クラスのヘッダー ファイルでメソッドを宣言することにより、警告メッセージを抑制することができるため、実装でメソッドを定義していないことに対してコンパイラが怒鳴ることはありません。

[self setPrimitiveValue:value forKey:@"key"];別のオプションは、アクセスする必要がある属性ごとに呼び出しを使用することです。私は過去にこの方法を使用しましたが、ドキュメントでこれが 10.5 以降では推奨されていないことに気付きました。

于 2011-03-04T19:07:48.250 に答える
3

ここで答えを見つけました:マネージドオブジェクトアクセサーメソッド

基本的@properyには、カテゴリヘッダーファイルで宣言し@dynamic、カテゴリ実装ファイルで定義します。

于 2012-01-04T04:42:58.120 に答える