への警告、私は次のような問題があります。我々のアプリはそれはバックエンドに起因する依存関係に(最初のバージョンでオフラインで実行する必要があります潜在的な顧客に示すことになるだろうと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だけを見たり、プロトコル(インターフェイス)に固執する必要があります。
これらの警告を回避する方法を知りたいだけです。すべての提案は大歓迎です。 ;)
ありがとうございました!