Основные данные и переходные свойства

У меня проблемы с настройкой временного свойства в Core Data. Проблема, которую я пытаюсь решить: у меня есть коллекция объектов, успешно сохраненных с использованием Core Data. Эта коллекция по сути является коллекцией только для чтения, но во время выполнения я хочу связать другой объект (в данном случае UIImage) с каждым элементом в коллекции. Мне не нужно хранить UIImages; это чисто ассоциация времени выполнения. Итак, что мне действительно нужно, так это «заполнитель» в каждом объекте в коллекции, куда я могу позже отбросить UIImage.

Переходный атрибут кажется правильным, и для этого справочные документы Core Data говорят мне, что я должен настроить «необязательный переходный атрибут типа undefined» в модели данных, которую я сделал:  фрагмент XCode

Кроме того, он сообщает мне, что мне не нужно определять соответствующее свойство в объекте реализации, но мне придется написать собственные методы доступа и установки. Я смоделировал эти методы на основе примеров в документации следующим образом:

- (void)setDisplayImage:(UIImage *)anImage {

    [self willChangeValueForKey:@"displayImage"];
    [self setPrimitiveValue:anImage forKey:@"displayImage"];
    [self didChangeValueForKey:@"displayImage"];
}

и:

- (UIImage *)displayImage {

    [self willAccessValueForKey:@"displayImage"];
    UIImage *anImage = [self primitiveDisplayImage];
    [self didAccessValueForKey:@"displayImage"];

    if (anImage == nil) {       
        NSData *displayImageData = [self displayImageData];
        if (displayImageData != nil) {
            anImage = [NSKeyedUnarchiver unarchiveObjectWithData:displayImageData];
            [self setPrimitiveDisplayImage:anImage];
        }
    }
    return anImage;
}

Существует также отложенный метод «записи» (willSave), который я написал для строгой полноты, хотя, как и выше, я никогда не буду записывать эти объекты обратно в хранилище.

Проблема, с которой я столкнулся, заключается в методах primitiveDisplayImage и setPrimitiveDisplayImage - (UIImage *) displayImage {. По сути, компилятор выдает предупреждения об этих двух методах, поскольку «объект X может не реагировать на 'primitiveDisplayImage' ..» и т. Д. Однако, как я понимаю из документации, эти примитивные средства доступа / установки создаются автоматически - это не похоже на дело. Кто-нибудь может помочь мне решить эту проблему? Большое спасибо


person skajam66    schedule 28.01.2011    source источник


Ответы (2)


Проблема с setPrimitive... методами заключается в том, что, хотя NSManagedObject будет отвечать на них во время выполнения, компилятор не имеет возможности узнать, что они существуют. Вы можете подавить предупреждающие сообщения, объявив метод в файле заголовка вашего класса сущности, используя категорию, чтобы компилятор не кричал на вас за то, что вы не определили его в вашей реализации.

Другой вариант - просто использовать вызов [self setPrimitiveValue:value forKey:@"key"]; для каждого из атрибутов, к которым вам нужно получить доступ. Я использовал этот метод в прошлом, хотя я только что заметил в документации, что это не рекомендуется в версии 10.5 и новее.

person Marc Charbonneau    schedule 04.03.2011