Настройка основных данных, созданных аксессорами - PullRequest
9 голосов
/ 12 марта 2012

Я настроил простую базовую схему данных, в которой объекты элементов добавляются в объекты списка. После генерации классов базовые данные создали стандартные средства доступа, в том числе несколько способов добавления элементов в список (list.addItemsObjects и list.addItems:).

Я также хочу добавить «dateAdded» NSDate для каждого элемента. Теперь я могу вручную установить это каждый раз, когда создаю объект, поскольку данные ядра предоставят мне средство доступа item.dateAdded. Но на самом деле, я бы предпочел, чтобы это обрабатывалось самим списком, поскольку реализация никогда не изменится. Поэтому каждый раз, когда я вызываю list.AddItemObject, я бы хотел, чтобы он устанавливал атрибут dateAdded элемента одновременно. Я думаю, что мне также нужно сделать то же самое в обратном порядке, так что item.setList также устанавливает dateAdded.

Я не уверен, как это сделать. Должен ли я попытаться переопределить существующие средства доступа, генерируемые основными данными? Если да, то как мне это сделать (есть ли способ вызвать исходную реализацию внутри моего пользовательского кода, чтобы обрабатывались обратные отношения и любые другие основные потребности в данных)? Или есть какой-то лучший способ настроить эти методы?

1 Ответ

8 голосов
/ 12 марта 2012

Вы можете переопределить основные данные, созданные аксессорами.Вы должны обратить внимание на несколько особых вещей, таких как вызовы willChangeValueForKey и didChangeValueForKey, но помимо переопределения методов доступа это почти то же самое, что и всегда.

Прочитайте документацию Apple: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html

Это ясно объяснено множеством примеров.Просто обратите внимание на разницу между отношениями «один к одному» и «один ко многим».

Вам не нужно реализовывать обратную функциональность, это делается с помощью Core Data.Если вы позвоните по номеру list.AddItem, для вас автоматически будет вызван item.setList.

Так что просто добавьте нужный код для доступа к item.setList.Таким образом, вы гарантируете, что при каждом добавлении элемента в список дата обновляется соответствующим образом.Не беспокойтесь о методах доступа к списку.

Ваш код будет выглядеть примерно так:

- (void)setList:(List *)value
{
    [self willChangeValueForKey:@"list"];
    [self setPrimitiveValue:[NSDate date] forKey:@"dateAdded"]; // use setValue:forKey: if you need KVO for dateAdded
    [self setPrimitiveValue:value forKey:@"list"];
    [self didChangeValueForKey:@"list"];
}

РЕДАКТИРОВАТЬ Я подумал еще раз, и вы можете захотетьзнать следующее:

Если вы настраиваете методы списка (то есть addItemObject), вам также необходимо настроить setItems.Кроме того, если ваш элемент добавлен в список, который, как оказалось, не является настроенным вами списком, ваш пользовательский код, конечно, не вызывается.

С другой стороны, если вы настраиваете метод setList,код не вызывается, если для элемента нет изменений.

Например, если вы позвоните

[list addItems:[NSSet setWithObject:item]];
[list addItemsObject:item];

, тогда элемент доступа setList элемента будет толькозвонил один раз!Звонки напрямую на item.setList всегда выполняются, даже если ничего не изменилось.

...