2012-03-12 2 views
8

Стандартная декларация для сгенерированного NSManagedObject собственности объявляет ко-многим, как это:Переменные множества в NSManagedObjects?

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

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

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

ответ

11

Согласно заявлению 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

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

  1. Использование key value coding
  2. Добавить ядро ​​data generated accessors

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

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 

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

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

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

+0

вызовет проблему, если я добавлю уже существующий объект в отношение – Johnykutty

+2

@ Наборы Johnykutty гарантируют, что дубликатов нет. Это не должно иметь никакого эффекта. – wbyoung

Смежные вопросы