Ios 使用圆弧和动态属性替代设置器

Ios 使用圆弧和动态属性替代设置器,ios,core-data,ios5,overriding,setter,Ios,Core Data,Ios5,Overriding,Setter,我需要在setter方法中做一些额外的工作。但这样做时,我会得到一个无限循环: 我有一个核心数据对象 @interface Transaction : NSManagedObject @property (nonatomic, retain) NSDate * date; @end @implementation Transaction @dynamic date; -(void)setDate:(NSDate *)date { self.date = date; //ad

我需要在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
}
现在,我在问自己怎么做

核心数据中的“日期”是否有相应属性支持

如果是,请看一看

如果不是,并且您不需要保留“日期”,则您的代码应如下所示:

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

@implementation Transaction
@synthesize date = _date;

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

我的问题的解决方案:

@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
}

以下是在.m中覆盖NSManagedObject属性而不破坏KVO的Apple方法:

@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
}

如本页底部所示

在之前调用willChangeValueForKey,在之后调用didChangeValueForKey以保留KVO。