2011-07-07 5 views
3

への警告、私は次のような問題があります。我々のアプリはそれはバックエンドに起因する依存関係に(最初のバージョンでオフラインで実行する必要があります潜在的な顧客に示すことになるだろうとNSManagedObject - による@dynamic

を今終了していない)ので、アプリケーションに表示されるすべてのデータは、CoreDataによってsqlite dbから取得されます。 後でリファクタリングすることを避けたいので、CoreDataエンティティをプロトコルの背後に置くことにしました。サービスはすべてのデータ検索を処理し、対応するプロトコルでエンティティを非表示にします。

以降のバージョンのアプリでは、UI開発者はサービスをバックエンドに切り替えるだけで、プロトコルに固執するため、コードの残りの部分を変更する必要はありません。 UI開発者の場合、エンティティがNSManagedObjectsまたはNSObjectsだけであれば、違いはありません。

これで問題が発生します。 私たちは、アプリケーション内のすべてのエンティティのプロトコル(set-とget-methods)を宣言し、それらのプロトコルに適合するCoreDataエンティティを生成しました。 CoreDataは@dynamicをすべてのset/get-Methodsに使用しています(これは、CoreDataフレームワークから実行時に生成されます)。

すべてのNSManagedObjectsは対応するプロトコルを実装する必要がありますが、コンパイラはCoreData-Objectがプロトコルを実装していないという警告(@dynamicのため)を提供しています。私はちょうど詳細に私の問題を説明するためにあなたに1つのエンティティと対応するプロトコルを与えたい

TaskCD.h

@interface TaskCD : NSManagedObject<Task> { 
@private 
} 
@property (nonatomic, retain) NSString * category; 
@property (nonatomic, retain) NSNumber * frequency; 
@property (nonatomic, retain) NSDate * validityEnd; 
@property (nonatomic, retain) NSDate * validityStart; 
@property (nonatomic, retain) NSNumber * periodicity; 
@property (nonatomic, retain) NSString * descr; 
@property (nonatomic, retain) NSNumber * selected; 
@property (nonatomic, retain) NSSet* measurements; 

@end 

TaskCD.m

#import "TaskCD.h" 
#import "MeasurementCD.h" 

@implementation TaskCD 
@dynamic category; 
@dynamic frequency; 
@dynamic validityEnd; 
@dynamic validityStart; 
@dynamic periodicity; 
@dynamic descr; 
@dynamic selected; 
@dynamic measurements; 

.... CoreData One-To-Many-stuff .... 

@end 

Task.h

@protocol Task <NSObject> 

- (NSString*) getCategory; 
- (void) setCategory:(NSString*) category; 

- (NSNumber*) getFrequency; 
- (void) setFrequency:(NSNumber*) frequency; 

- (void) setValidityEnd:(NSDate *) date; 
- (NSDate *) getValidityEnd; 

- (void) setValidityStart:(NSDate *) date; 
- (NSDate *) getValidityStart; 

- (void) setPeriodicity:(NSNumber *) number; 
- (NSNumber *) getPeriodicity; 

- (void) setDescr:(NSString *) descr; 
- (NSString *) getDescr; 

- (void) setSelected:(NSNumber *) selected; 
- (NSNumber *) getSelected; 

- (void) setMeasurements:(NSSet*) measurements; 
- (NSSet *) getMeasurements; 

@end 

私はObjCの経験がありません。私はJava Developmentから来ています。おそらく、それは設計上の失敗であり、ObjCの問題ではないでしょう。私たちが間違いなく固執したいのは、本物のバックエンドを持つ生産的なバージョンでは、UI開発者はCoreDataの内容を守るためにNSManageObjectクラスで作業するべきではないということです。彼はちょうど1つのファサードを見て、背後のレイヤー(First CoreData、後のRESTバックエンド)とやり取りするためのAPIを提供しています。 UI開発者は、単純なVOだけを見たり、プロトコル(インターフェイス)に固執する必要があります。

これらの警告を回避する方法を知りたいだけです。すべての提案は大歓迎です。 ;)

ありがとうございました!

答えて

3

私はバットから提案できることのひとつ:Task.hで定義されたアクセサは、TaskCDインターフェイスの@property宣言の名前と一致する必要があります。代わりに:

- (NSString*) getCategory; 

あなたのようにそれを宣言する必要があります

// this is the more common Obj-C naming convention 
- (NSString*) category; 

代わりに、TaskCDで@property宣言(でアクセサを "取得" の名前を指定します。H):コアデータでも

//meh... not so nice 
@property (nonatomic, retain, getter=getCategory) NSString * category; 

IMHO、あなたではなくあなた自身を実装するよりも、動的に生成されたアクセサを使用して、オフはるかに良いです。

0

最初に、私はオクテに同意すると言いたいのは、最も標準的なObjective-Cアクセサー名を使用するようにプロトコルを変更するのが最善の解決策だという点です。

@interface TaskCD (Accessors) <Task> 

... 

@implementation TaskCD (Accessors) 

- (NSString *) getCategory { 
    return [self category]; 
} 

... 

これを:

はしかし、私はまた、あなた基本的にあなたがしたいアクセサ名にそのアクセサメソッドをマッピングし、あなたの生成CoreDataオブジェクトのそれぞれについてcategoryを作成することができますオプションを投げると思いました生成されたファイルを保持して(ただし、しばしば好きなように再生成しますが)、独自のアクセサメソッド名を使用することができます。

私はまだ、Objective-Cのデフォルトアクセサの名前を付けておく方が良いと思います。

0

次のようなアプローチがあります。コアデータを後でRESTバージョンで保存し、ローカルのコアデータストレージをライブデータで更新するだけで、それぞれNSManagedObjectsが使用されます。 UIの内容にコアデータを使用することは、実際には良いアイデアです。多くのメリットがあります(たとえば、スクロールするときにコアデータから行を連続的に取得するテーブルビューにフィードする)

関連する問題