2012-03-12 6 views
8

自動生成NSManagedObjectプロパティのための標準的な宣言は、このような対多の関係を宣言しますか? CoreDataコンポーネントは引き続き正しく機能しますか? @dynamicから判断NSManagedObjectsの変更可能なセット?</p> <pre><code>@property (nonatomic, retain) NSSet *somethings; ... @dynamic somethings; </code></pre> <p>は<code>NSMutableSet</code>にその宣言を変更しても安全だろう:

、私はむしろNSSetよりNSSetサブクラスを使用している場合、それはprobaby気にしませんが、私はそれが動作しません見つけるために多くのコードを書き換える必要はありません。

答えて

11

AppleのCore Data Programming Guideによると、これは常にNSSetとして宣言する必要があります。

あなたは、あなたがこのように機能mutableSetValueForKeyを使用します(基本的にはコアデータセットの変更可能なバージョンで、まったく同じ動作します)ミュータブルなプロキシをしたい場合:

// myManagedObject is the managed object that has the somethings property. 
NSMutableSet *mutableSomethings = [myManagedObject mutableSetValueForKey:@"somethings"]; 

mutableSomethingsは、その後変更することができます標準NSMutableSetとしてsomethingsが更新され、KVOメソッドが適切に呼び出されます。

ただし、変更可能なセットの多くの機能(addSomethingsObjectおよびremoveSomethingsObjectなど)は、コアデータ生成アクセサにすでに用意されているため、多くの場合、プロキシを使用する必要はありません。

6

あなたはNSSetとしてそれを維持し、次のいずれかを実行する必要があります。

  1. 使用key value coding
  2. コアにキー値コーディングのためにdata generated accessors

を追加し、あなたのコレクションにアクセスしますように:

NSMutableSet *somethings = [object mutableSetValueForKey:@"somethings"]; 
[somethings addObject:newObject]; 

@interface MyManagedObject (CoreDataGenerated) 
- (void)addSomethingsObject:(MySomething *)object; 
- (void)removeSomethingsObject:(MySomething *)object; 
- (void)addSomethings:(NSSet *)somethings; 
- (void)removeSomethings:(NSSet *)somethings; 
@end 

あなたは(コアデータはあなたのためにそれの世話をする)これらのメソッドを実装する必要はありません、あなたは簡単にそれらを呼び出すことができます。アクセサ生成されたコアのデータは、あなたのヘッダに以下を追加したいです。これは、コンパイラからの型チェックの方が優れているので、コレクションを処理するための私の好みの方法です。

NSMutableSetに変更しない理由は、クラッシュする可能性があり、変更がコアデータストアに保存されない可能性があるからです。

また、mogeneratorを参照すると、すべてのCocoaクラスを作成するのに役立ちます。

+0

すでに存在するオブジェクトを関係に追加すると問題はありません – Johnykutty

+2

@Johnykuttyセットは重複がないことを保証します。これは効果がないはずです。 – wbyoung

関連する問題