关于ios:将@propertys添加到Core Data类

Add @propertys to Core Data class

我很少通过核心数据来上课。我还需要一些额外的@property,用于运行时的其中一个类。这个@propertys负责下载进度,我不想将它们存储在核心数据数据库中。我尝试使用单独的扩展类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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。有人能给我一些建议吗?


最简单的解决方案(如果不想修改Xcode生成的类文件)是将属性添加到核心数据模型并定义属性为瞬态。临时属性不会保存到存储文件中。

另一种选择是使用类似"mogenerator"的工具,它为每个类生成两个类文件实体,一个用于核心数据属性(如果模型更改,将覆盖该属性),一个用于自定义属性(不会被覆盖)。

更新:从xcode 7开始,xcode创建一个类和每个托管对象子类的类别,比较类别中的nsmanagedObject subclass属性。自定义属性可以添加到类中在模型更改时不被覆盖的定义。


只要添加

1
2
@synthesize downloadErrorCounter = _downloadErrorCounter;
...

在@implementation中。注意,不是@dynamic。


当尝试使用@synthesize解决方案时,我得到了错误:

1
@synthesize not allowed in a category's implementation.

解决方案是使用本博客中描述的关联对象:http://kaspermunck.github.io/2012/11/adding-properties-to-objective-c-categories/

myManagedObject+添加项.h

1
@property (strong, nonatomic) NSString *test;

myManagedObject+添加.m

1
2
3
4
5
6
7
8
9
10
11
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);
}