2011-12-17 2 views
3

Мне нужно сделать некоторые дополнительные вещи в методе сеттера. Но я получаю бесконечный цикл при этом:Переопределяющие сетки с дуговыми и динамическими свойствами

У меня есть основные данные объекта

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

Теперь я спрашиваю себя, как это сделать?

ответ

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

Он ломает КВО ... – AlexeyVMP

+2

Вызов willChangeValueForKey до и после didChangeValueForKey держать КВО. – brodney

2

Есть ли «дата», поддерживаемая соответствующим атрибутом в Core Data?

Если это так, пожалуйста, посмотрите на Custom setter methods in Core-Data

Если нет, и вы не должны сохраняться «дата», код должен быть следующим:

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

@implementation Transaction 
@synthesize date = _date; 

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

Вот новый способ для переопределения свойств NSManagedObject, не нарушая КВО, в вашем .m:

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

@implementation Transaction 
@dynamic date; 

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

Как видно на нижней части этой страницы What's New in Core Data in macOS 10.12, iOS 10.0, tvOS 10.0, and watchOS 3.0

Смежные вопросы