Objective-C: переопределить динамический геттер - PullRequest
6 голосов
/ 13 сентября 2011

У меня есть NSManagedObject подкласс MyClass со свойством myProp, которое определено @dynamic.В моем коде есть несколько случаев чтения myProp через [myClass myProp].

Теперь я хочу определить метод получения (который возвращает myProp после добавления чего-либо к нему) для myProp, безизменив различные вызовы на [myClass myProp].т.е. без создания геттера с именем, отличным от getMyProp.

Мой вопрос: если я создаю геттер getMyProp, который переопределит геттер, созданный NSManagedObject, как мне получитьисходное значение, которое хранится в базе данных?

Спасибо,

Акшай

1 Ответ

17 голосов
/ 13 сентября 2011

Для доступа к базовым значениям управляемого объекта используются следующие два метода:

- (id) primitiveValueForKey: (NSString *) ключ

- (void) setPrimitiveValue: (id) значение forKey: (NSString *) ключ

Это часто используется для преобразования атрибутов NSNumber в их «реальный» тип, например свойство bool:

- (BOOL)isShared
{
    [self willAccessValueForKey:@"isShared"];
    NSNumber *underlyingValue = [self primitiveValueForKey:@"isShared"];
    [self didAccessValueForKey:@"isShared"];
    return [underlyingValue boolValue];
}

willAccessValueForKey: и didAccessValueForKey: требуются базовым классом управляемых объектов для обработки ошибок, отношений и т. Д.

И если вы в конечном итоге пишете установщик, вы должны также обернутьметод доступа в методах KVC:

- (void)setShared:(BOOL)isShared
{
    NSNumber *newUnderlyingValue = [NSNumber numberWithBool:isShared];
    [self willChangeValueForKey:@"isShared"];
    [self setPrimitiveValue:newUnderlyingValue forKey:@"isShared"];
    [self didChangeValueForKey:@"isShared"];
}

Сказав это, я лично не рекомендовал бы, чтобы у вас было то же имя метода, если у вас нет веской причины.Для «производных» значений вы, как правило, хотите создать новый метод с другим именем.Быстрый поиск и замена всего кода не займет много времени.

РЕДАКТИРОВАТЬ: добавлено willAccessValueForKey: / didAccessValueForKey: (спасибо jrturton)

...