我通过Core Data创建了几个课程。我需要在运行时为其中一个类添加一些额外的@property
。这个@property
负责下载进度,我不想将它们存储在Core Data DB中。我试图使用一个单独的扩展类:
@interface MyClass ()
{
CGFloat _downloadProgress;
NSInteger _downloadErrorCounter;
BOOL _downloadAllStuff;
BOOL _downloadUserCanceled;
}
@property (nonatomic, assign) CGFloat downloadProgress;
@property (nonatomic, assign) NSInteger downloadErrorCounter;
@property (nonatomic, assign) BOOL downloadAllStuff;
@property (nonatomic, assign) BOOL downloadUserCanceled;
@end
但私有变量在MyClass中是不可见的,@property
编译得很好,但在运行时我得到-[MyClass setDownloadErrorCounter:]: unrecognized selector sent to instance
。
有谁能建议我一些解决方案?
答案 0 :(得分:6)
最简单的解决方案(如果您不想修改Xcode生成的类文件)是将属性添加到Core Data模型并定义 属性为 transient 。瞬态属性不会保存到商店文件中。
另一个选择是使用像“mogenerator”这样的工具,它为每个工具生成两个类文件 实体,一个用于Core Data属性(如果模型更改则覆盖), 和一个用于您的自定义属性(不覆盖)。
更新:从 Xcode 7开始, Xcode创建了一个类和 每个托管对象子类的类别,比较NSManagedObject subclass property in category。可以将自定义属性添加到类中 模型更改时不会覆盖的定义。
答案 1 :(得分:1)
添加
@synthesize downloadErrorCounter = _downloadErrorCounter;
...
@implementation中的。注意,不是@dynamic。
答案 2 :(得分:0)
尝试使用@synthesize
解决方案时出现错误:
@synthesize not allowed in a category's implementation.
解决方案是使用此博客中描述的关联对象:http://kaspermunck.github.io/2012/11/adding-properties-to-objective-c-categories/
MyManagedObject + Additions.h
@property (strong, nonatomic) NSString *test;
MyManagedObject + Additions.m
NSString const *key = @"my.very.unique.key";
- (void)setTest:(NSString *)test
{
objc_setAssociatedObject(self, &key, test, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)test
{
return objc_getAssociatedObject(self, &key);
}