NSManagedObject подклассы и setValuesForKeysWithDictionary: - PullRequest
7 голосов
/ 02 декабря 2009

Я инициализирую подкласс NSManagedObject, используя:

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues

Я также сознательно даю ему неопределенные ключи, которые, конечно, должны вызвать исключение.

Итак, я реализовал:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key

Если ключ не определен, я сопоставляю его с правильным ключом.

Однако моя реализация никогда не вызывается, вместо этого используется реализация NSManagedObject, которая, в свою очередь, все еще выдает исключение.

Есть ли поведение (или ошибка), мешающее setValuesForKeysWithDictionary: использовать любую реализацию NSManagedObject подкласса setValue:forUndefinedKey:?

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

В контексте:

- (Company*)companyWithDictionary:(NSDictionary*)values{

    Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self];

    [newCompany setValuesForKeysWithDictionary:values];

    return newCompany;
}

В подклассе Company (никогда не вызывается):

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

    if([key isEqualToString:idKey]){

        [self setValue:value forKey:@"uniqueID"];

    }else if([key isEqualToString:descriptionKey]){

        [self setValue:value forKey:@"descriptionText"];

    }else if([key isEqualToString:timeUpdatedKey]){

        [self setValue:value forKey:@"dateUpdated"];

    }else{

        [super setValue:value forUndefinedKey:key];

    } 
}

Ответы [ 3 ]

3 голосов
/ 02 декабря 2009

В NSManagedObject определенно нет ничего, что могло бы помешать этому; Я делаю именно это в приложении, над которым я работаю. Можете ли вы опубликовать больше своего кода?

Одна мысль также: вы уверены, что setValue:forUndefinedKey: вызывает исключение? Я уверен, что для управляемого объекта вам необходимо реализовать valueForUndefinedKey: (метод получения), чтобы все работало правильно.

2 голосов
/ 02 декабря 2009

Простой вопрос, но указываете ли вы имя класса вашего подкласса NSManagedObject для сущности в вашей модели?

Кроме того, вы сказали, что инициализируете управляемый объект ... как? Вы должны вставлять его через + [NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:] в большинстве случаев, если у вас нет веских причин не делать этого.

1 голос
/ 02 декабря 2009

Быстрый дамп класса инфраструктуры CoreData показывает, что NSManagedObject также переопределяет setValuesForKeysWithDictionary:, поэтому похоже, что он определенно выполняет некоторые настройки для этого метода, возможно, из-за соображений производительности или чего-то подобного. Я, вероятно, просто напишу свой собственный метод, эквивалентный setValuesForKeysWithDictionary:, и вызову его, чтобы избежать всего беспорядка. Примерно так:

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict
{
    for (NSString* key in dict)
        [self setValue:[dict objectForKey:key] forKey:key];
}
...