Понимание переходных свойств с помощью NSFetchedResultsController

Я начинаю создавать приложение с Core Data, чтобы получить данные для секционированной таблицы, которую я хочу использовать NSFetchedResultController, в пример от Apple есть два дополнительных свойства.

  • примитивВременная метка
  • примитивный идентификатор секции

В случае primitiveSectionIdentifier Apple говорит, что

Напротив, с переходными свойствами вы указываете два атрибута, и вам нужно написать код для выполнения преобразования.

потому что идентификатор раздела является временным свойством. Но как насчет timeStamp? Этот атрибут не является переходным, почему существует свойство примитивного TimeStamp? и почему для timeStamp существует явный установщик?

- (void)setTimeStamp:(NSDate *)newDate {

    // If the time stamp changes, the section identifier become invalid.
    [self willChangeValueForKey:@"timeStamp"];
    [self setPrimitiveTimeStamp:newDate];
    [self didChangeValueForKey:@"timeStamp"];

    [self setPrimitiveSectionIdentifier:nil];
}

или, может быть, это не настоящий сеттер? где _timeStamp=newDate?


person taffarel    schedule 05.06.2013    source источник


Ответы (1)


CoreData генерирует для вас средства доступа. Он генерирует «общедоступные и примитивные методы доступа для получения и установки для смоделированных свойств».

Итак, в этом случае он сгенерировал:

-(NSDate*)timeStamp;
-(void)setTimeStamp:;
-(NSDate*)primitiveTimeStamp;
-(void)setPrimitiveTimeStamp:;

"почему существует свойство примитивного TimeStamp?"

Объявление предназначено просто для подавления предупреждений компилятора. т.е. Если вы удалите объявление свойства, вы увидите предупреждение при компиляции, но код все равно будет работать. Или же вы можете использовать [self setPrimitiveValue:newDate forKey:@"timeStamp"];

"почему существует явный сеттер для timeStamp?"

Это необходимо, так как установка timeStamp требует пересчета sectionIdentifier. Это достигается путем установки значения no nil и разрешения методу доступа get лениво пересчитать его.

"где _timeStamp=newDate?"

Эквивалент этого по существу делается в автоматически сгенерированной реализации setPrimitiveTimeStamp.

Цитата из документов:

По умолчанию Core Data динамически создает эффективные общедоступные и примитивные методы доступа get и set для смоделированных свойств (атрибутов и отношений) классов управляемых объектов. Сюда входят изменяемые прокси-методы, кодирующие ключ-значение, такие как addObject: и removes:, как подробно описано в документации для mutableSetValueForKey: — управляемые объекты фактически являются изменяемыми прокси-серверами для всех их отношений ко многим.

Примечание. Если вы решите реализовать свои собственные методы доступа, динамически генерируемые методы никогда не заменят ваш собственный код. Например, для данной сущности с атрибутом firstName Core Data автоматически генерирует firstName, setFirstName:, примитивное первое имя и setPrimitiveFirstName:. Core Data делает это даже для сущностей, представленных NSManagedObject. Чтобы подавить предупреждения компилятора при вызове этих методов, вы должны использовать функцию объявленных свойств Objective-C 2.0, как описано в разделе «Декларация».

person Mike Pollard    schedule 05.06.2013
comment
спасибо за ответ, но я не совсем понял значение всех этих свойств с примитивным префиксом. Потому что, как я понимаю, Core Data генерирует примитивный геттер и сеттер для всех атрибутов в Entity, верно? не могли бы вы также объяснить, почему есть два свойства для одного атрибута - person taffarel; 05.06.2013