使用ARC和动态属性覆盖setter方法

3

我需要在setter方法中进行一些额外的操作。但是当我这样做时,会出现无限循环:

我有一个核心数据对象

@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date;
@end

@implementation Transaction
@dynamic date;

-(void)setDate:(NSDate *)date
{
    self.date = date;
    //additional stuff omitted
}

那么,在这种情况下,我会得到一个无限循环。好的,所以我在网上搜索并按照以下方式修改了我的代码,但每个版本都出现编译器错误。
版本1:
@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date;
@end

@implementation Transaction
@dynamic date;

-(void)setDate:(NSDate *)date
{
    self->date = date; //Error: Property 'date' found on object 'Transaction *'; did you mean to access it with the "." operator?
    //additional stuff omitted
}

版本2:

@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date;
@end

@implementation Transaction
@dynamic date = _date; //Error: Expected ';' after @dynamic

-(void)setDate:(NSDate *)date
{
    _date = date; 
    //additional stuff omitted
}

现在,我正在思考如何做到这一点?

3个回答

5
我的问题的解决方案:
@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date;
@end

@implementation Transaction
@dynamic date;

-(void)setDate:(NSDate *)date
{
    [self setPrimitiveValue:date forKey:@"date"];
    //additional stuff omitted
}

2
在使用 KVO 时,请在修改属性值之前调用 willChangeValueForKey,之后再调用 didChangeValueForKey。 - brodney

2

"date"在Core Data中是否有对应的属性?

如果有,请参考Core-Data中的自定义设置方法

如果没有,并且您不需要持久化“date”,则代码应如下:

@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date;
@end

@implementation Transaction
@synthesize date = _date;

-(void)setDate:(NSDate *)date
{
    _date = date; 
    //additional stuff omitted
}

1

以下是苹果公司的一种方法,用于在不破坏KVO的情况下覆盖NSManagedObject属性,在您的.m文件中:

@interface Transaction (DynamicAccessors)
- (void)managedObjectOriginal_setDate:(NSDate *)date;
@end

@implementation Transaction
@dynamic date;

- (void)setDate:(NSDate *)date
{
    [self managedObjectOriginal_setDate:(NSString *)date;
    // your custom code
}

正如在本页面底部所见 macOS 10.12、iOS 10.0、tvOS 10.0 和 watchOS 3.0 中的 Core Data 新功能


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接