Переопределение сеттеров с дуговыми и динамическими свойствами - PullRequest
3 голосов
/ 17 декабря 2011

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

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

@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 голосов
/ 18 декабря 2011

Решение моей проблемы:

@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 голосов
/ 17 декабря 2011

Поддерживается ли "дата" соответствующим атрибутом в Базовых данных?

Если это так, обратите внимание на Методы пользовательских настроек в 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
}
1 голос
/ 28 сентября 2017

Вот способ Apple переопределить свойства NSManagedObject, не нарушая KVO, в вашем .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
}

Как видно внизу этой страницы Что нового в Core Data в macOS 10.12, iOS10.0, tvOS 10.0 и watchOS 3.0

...