我有以下问题:NSManagedObject实施协议 - 由于@dynamic警告
随着我们的应用程序将被证明它在第一个版本的离线运行的潜在客户(由于依赖于后端是现在还没有完成),因此应用程序中显示的所有数据都将由CoreData从sqlite数据库中检索。由于我们希望避免以后的重构,我们决定将CoreData实体放在协议后面。服务将负责所有的数据检索并隐藏具有相应协议的实体。
在应用程序的更高版本中,UI开发人员只需将服务切换到后端人员,而不必因为遵守协议而更改其他代码。对于UI开发人员来说,如果实体将是NSManagedObjects或者仅仅是NSObjects,那么它们没有什么区别。
现在出现这个问题。 我们已经为我们的应用中的所有实体以及生成的适合这些协议的CoreData实体声明了协议(set-和get-Methods)。 CoreData对所有set/get-Methods(我们将在运行时从CoreData框架生成)使用@dynamic。
所有NSManagedObjects现在应该履行其相应的协议,但是编译器被给予了警告(因为@dynamic)的CoreData-对象不执行协议。
我只是想给你一个实体及相应的协议详细解释我的问题:
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开发。也许这是一个设计失败,而不是一个ObjC问题。我们想要坚持的是,在具有真实后端的高效版本中,UI开发人员不应该使用NSManageObject类来保留CoreData的东西。他只看到一个门面给了他一个API来与后面的层进行交互(First CoreData,后来的REST后端)。 UI开发人员应该只看到普通的VO或坚持使用协议(接口)。
我只想知道如何避免这些警告。所有提案都是受欢迎的;)
在此先感谢家伙!