2012-03-11 11 views
9

シンプルなコアデータスキーマを設定しました。そこでは、アイテムオブジェクトがリストオブジェクトに追加されます。クラスを生成した後、コアデータによって標準アクセサーが生成されました。リストに項目を追加する方法(list.addItemsObjectsおよびlist.addItems :)の2つの方法があります。コアデータ生成アクセサのカスタマイズ

また、各アイテムに「dateAdded」NSDateを追加します。今度は、オブジェクトを作成するたびに手動で設定することができます。コアデータはitem.dateAddedアクセサを提供します。しかし、実際には、実装自体は変わることはないので、これはリスト自体によって処理されることをお勧めします。ですから、私がlist.AddItemObjectを呼び出すたびに、アイテムのdateAdded属性を同時に設定したいと思います。私はまた、item.setListもdateAddedを設定するように、逆も同じことを行う必要があると思います。

私はこれを行う方法がわかりません。既存のコアデータ生成アクセサを再定義する必要がありますか?もしそうなら、私はこれをどのようにして行うのですか(逆の関係が処理されるような私のカスタムコード内の元の実装を呼び出すことがありますか?あるいは、これらのメソッドをカスタマイズするいくつかの良い方法がありますか?

答えて

8

コアデータで生成されたアクセサをオーバーライドできます。 willChangeValueForKeydidChangeValueForKeyのようないくつかの特別なことに注意する必要がありますが、アクセサーをオーバーライドするもの以外は常にほとんど同じです。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html

それは多くの例で明確に説明です:

は、Appleのドキュメントを読んでください。 1対1と1対多の関係の違いに注意してください。

逆機能を実装する必要はありません。これはコアデータによって行われます。 list.AddItemに電話すると、item.setListが自動的に呼び出されます。

アクセサーのitem.setListに目的のコードを追加してください。そうすれば、アイテムがリストに追加されるたびに日付がそれに応じて更新されることが保証されます。リストアクセサを気にしないでください。

- (void)setList:(List *)value 
{ 
    [self willChangeValueForKey:@"list"]; 
    [self setPrimitiveValue:[NSDate date] forKey:@"dateAdded"]; // use setValue:forKey: if you need KVO for dateAdded 
    [self setPrimitiveValue:value forKey:@"list"]; 
    [self didChangeValueForKey:@"list"]; 
} 

EDIT私はそれを別の考えを与えてくれたし、あなたが次のことを知りたいかもしれません:

あなたのコードは次のようなものになるだろう

リスト方式(すなわちカスタマイズする場合addItemObject )、setItemsもカスタマイズする必要があります。また、カスタマイズしたリストではないリストにアイテムが追加された場合、カスタムコードはもちろん呼び出されません。

一方、setListメソッドをカスタマイズすると、コードにはではなく、が呼び出され、アイテムに変更がない場合に呼び出されます。

たとえば、あなたが

[list addItems:[NSSet setWithObject:item]]; 
[list addItemsObject:item]; 

を呼び出す場合、アイテムのsetListアクセサは一度だけ呼び出されます! item.setListへの通話は、何も変更されていない場合でも常に呼び出されます。

+0

ありがとうございます。私はそれをスキャンして完全に今読んでいる。私が言及していない1つの部分 - 逆アクセサーに同じカスタマイズを適用する必要がありますか?つまり、list.addItemObjectをカスタマイズした後、item.setListもカスタマイズする必要がありますか? –

+0

質問の回答を更新しました – JiaYow

+0

ありがとうございました。しかし、単純なsetListの代わりに、私のカスタマイズをinverse、list.addItemsObject(to-manyドキュメントを参照)に追加しました。私はitem.setListを呼び出すと呼び出されないことがわかりました。 –