Изменяемые множества в NSManagedObjects? - PullRequest
8 голосов
/ 12 марта 2012

Стандартное объявление для автоматически сгенерированного свойства NSManagedObject объявляет отношения ко многим следующим образом:

@property (nonatomic, retain) NSSet *somethings;
...
@dynamic somethings;

Было бы безопасно изменить это объявление на NSMutableSet?Будет ли компонент CoreData работать правильно?

Судя по @dynamic, вероятно, ему все равно, если я использую подкласс NSSet вместо NSSet, но я не хочу переписыватьмного кода только для того, чтобы узнать, что он не работает.

Ответы [ 2 ]

11 голосов
/ 15 марта 2012

Согласно Apple Core Data Programming Guide , это всегда должно быть объявлено как NSSet.

Если вам нужен изменяемый прокси-сервер (который в основном является изменяемой версией основного набора данных и работает точно так же), вы бы использовали функцию mutableSetValueForKey следующим образом:

// myManagedObject is the managed object that has the somethings property.
NSMutableSet *mutableSomethings = [myManagedObject mutableSetValueForKey:@"somethings"];

mutableSomethings может быть затем изменен как стандартный NSMutableSet, и somethings будет обновлен, и методы KVO будут соответствующим образом вызваны.

Обратите внимание, что многие функции изменяемого набора (такие как addSomethingsObject и removeSomethingsObject) уже предусмотрены в средствах доступа, генерируемых основными данными, поэтому во многих случаях вам не нужно использовать прокси.

6 голосов
/ 15 марта 2012

Вы должны сохранить его как NSSet и выполнить одно из следующих действий:

  1. Использовать код значения ключа
  2. Добавление ядра сгенерированных данных аксессоров

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

NSMutableSet *somethings = [object mutableSetValueForKey:@"somethings"];
[somethings addObject:newObject];

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

@interface MyManagedObject (CoreDataGenerated)
- (void)addSomethingsObject:(MySomething *)object;
- (void)removeSomethingsObject:(MySomething *)object;
- (void)addSomethings:(NSSet *)somethings;
- (void)removeSomethings:(NSSet *)somethings;
@end

Вам не нужно реализовывать эти методы (Core Data позаботится об этом за вас), и вы можете легко вызывать их. Это мой предпочтительный способ обработки коллекций, потому что вы получаете лучшую проверку типов из компилятора.

Причина, по которой вы не должны менять его на NSMutableSet, заключается в том, что существует высокая вероятность того, что вы вызовете сбои и / или что ваши изменения не будут сохранены в вашем хранилище базовых данных.

Вы также можете заглянуть в mogenerator , чтобы помочь вам с созданием всех ваших классов Какао.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...