NSManagedObject подклассы и setValuesForKeysWithDictionary:

Я инициализирую 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 ответа

Решение

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

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

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

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

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

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict
{
    for (NSString* key in dict)
        [self setValue:[dict objectForKey:key] forKey:key];
}
Другие вопросы по тегам