2013-04-06 5 views
18

CoreDataの使用エンティティを作成した後、それを@propertysを持つ独自のファイルにサブクラス化し、次に.mファイルに@dynamicの部分があります。CoreDataでは@dynamicプロパティがある場合、@synthesizedのようにゲッターをオーバーライドできますか?

私はそれが設定されていないなら、何かが一定の値を持つようにしたい場合は、次のように私はいつも、怠惰なインスタンス化を使用します。

- (NSString *)preview { 
    if ([self.body length] < 200) { 
     _preview = self.body; 
    } 
    else { 
     _preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
    } 

    return _preview; 
} 

をしかし、私は@dynamicのプロパティでこれをどのように行うのですか?同じことをすると、_previewは宣言されていないプロパティですが、.hファイルにあります。私は怠け者と違う何をしているのですか? primitiveValueForKey:

基本的使用に関する

+1

'_preview'は宣言されていない_indentifier_です。その名前の変数がないためです。 '@ synthesize'は変数を作成します。 '@dynamic'は行いません。 –

答えて

27

1つの標準的な方法は、(コアデータモデル内一時属性としてpreviewを定義することですデータベースで)、カスタムゲッターメソッドを実装します。 (カスタムゲッター、@dynamicプロパティのセッターメソッドを提供することができますが、コアデータ プロパティは、単純にインスタンス変数によってバックアップされていないことが、なぜ理由である

- (NSString *)preview 
{ 
    [self willAccessValueForKey:@"preview"]; 
    NSString *preview = [self primitiveValueForKey:@"preview"]; 
    [self didAccessValueForKey:@"preview"]; 
    if (preview == nil) { 
     if ([self.body length] < 200) { 
      preview = self.body; 
     } else { 
      preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
     } 
     [self setPrimitiveValue:preview forKey:@"preview"]; 
    } 
    return preview; 
} 

:。。あなたのケースでは、それは次のようになります。ない アクセス_previewことができます。)

あなたはbody属性が変更された場合、再計算されるpreviewが必要な場合は、 も戻っnilからpreviewを設定bodyのカスタムsetterメソッドを実装する必要があります。

詳細については、「コアデータプログラミングガイド」のNon-Standard Persistent Attributesを参照してください。

更新:コアデータプログラミングガイドの現在のバージョンでは、この章はもはや含まれていません。 Way Back Machineのアーカイブ済みバージョン があります。もちろんこれは公式の文書 の一部ではないので、 の塩で取られなければなりません。

+0

完璧な答え@マーティン。 – satheeshwaran

+0

@satheeshwaran:ありがとう。 –

+0

その方法を使用するだけですか? CoreDataファイルで何かする必要がありますか? – user212541

6

See documentation:値が実際に格納されないように

@dynamic name; 

- (NSString *)name 
{ 
    [self willAccessValueForKey:@"name"]; 
    NSString *myName = [self primitiveName]; 
    [self didAccessValueForKey:@"name"]; 
    return myName; 
} 

- (void)setName:(NSString *)newName 
{ 
    [self willChangeValueForKey:@"name"]; 
    [self setPrimitiveName:newName]; 
    [self didChangeValueForKey:@"name"]; 
} 
関連する問題