2011-09-13 10 views
2

私のプロジェクトでは、コアデータを使用する次のような状況があります。私は、2つのBOOLプロパティisCompletedとisNonVisitを持つエンティティを持っています。 NSNumber * status - プロパティの値は、isCompleted値とisNonVisit値の両方に依存します。コアデータ:他に依存するプロパティを実装する

いずれかのBOOLプロパティが変更された場合、ステータスプロパティを自動的に実現します。

ステータスプロパティ(ソートデスクリプタおよびsectionNameKeyPath)を使用するfetchedResultsControllerを使用するため、3つのプロパティがすべて基になるデータベースに存在する必要があります。

私は、次の解決策を考え出した:.hファイルに

:.Mファイルに

@property (nonatomic, retain) NSNumber *isCompleted; 
@property (nonatomic, retain) NSNumber *isNonVisit; 
@property (nonatomic, retain) NSNumber *status; 

- (NSNumber *)calculateStatus; //Returns proper status value based on isCompleted and nonVisit property values. 

@dynamic isCompleted; 
@dynamic isNonVisit; 
@dynamic status; 

- (void)setIsCompleted:(NSNumber *)newValue 
{ 
    [self willChangeValueForKey:@"isCompleted"]; 
    [self setPrimitiveValue:newValue forKey:@"isCompleted"]; 
    [self didChangeValueForKey:@"isCompleted"]; 

    self.status = [self calculateStatus]; 
} 


- (void)setIsNonVisit:(NSNumber *)newValue 
{ 
    [self willChangeValueForKey:@"isNonVisit"]; 
    [self setPrimitiveValue:newValue forKey:@"isNonVisit"]; 
    [self didChangeValueForKey:@"isNonVisit"]; 

    self.status = [self calculateStatus]; 
} 

ソリューションが動作するようです。

私の質問です。それは問題ありませんか? CoreDataまたはKVOのいくつかのルールに違反していますか?

ありがとうございます。

答えて

1

あなたの方法は妥当と思われます。

唯一の唯一の提案は、それらを格納するのではなくアクセサメソッドで状態からブール情報を抽出して冗長性を減らすことです。ステータス変数を使用するだけで、フェッチ要求に必要な述部を使用できるはずです。しかし、この余分な情報を格納するオーバーヘッドは最小限に抑える必要があります。

+0

ありがとうございます。あなたが正しいです。しかし、isCompletedとisNonVisitを別々のフィールドに格納するのは、これらのプロパティが以前のバージョンのアプリケーションで使用されていたのに対し、statusプロパティは新しいプロパティです。だから、私は古いものを取り除きたくないのです(もちろん、それらを取り除くことは可能です)。 – manicaesar

関連する問題