将@propertys添加到Core Data类

时间:2013-07-01 07:59:44

标签: ios objective-c core-data

我通过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。 有谁能建议我一些解决方案?

3 个答案:

答案 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);
}