Подтвердить что ты не робот

С CoreData, если у меня есть свойство @dynamic, могу ли я переопределить его getter, как это было @synthesized? (Ленивый инстанцирование)

Используя CoreData, я создал объект, затем я подклассифицировал его в свой собственный файл, где он имеет @propertys, затем он имеет @dynamic части в файле .m.

Когда я хочу, чтобы что-то имело определенное значение, если оно никогда не было установлено, я всегда использую ленивый экземпляр, например:

- (NSString *)preview {
    if ([self.body length] < 200) {
        _preview = self.body;
    }
    else {
        _preview = [self.body substringWithRange:NSMakeRange(0, 200)];
    }

    return _preview;
}

Но как мне это сделать с помощью @dynamic-свойств? Если я делаю то же самое, он говорит, что _preview - это незадекларированное свойство, но оно в файле .h. Что я делаю по-разному, чтобы ленивый создать его экземпляр?

4b9b3361

Ответ 1

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

- (NSString *)preview
{
    [self willAccessValueForKey:@"preview"];
    NSString *preview = [self primitiveValueForKey:@"preview"];
    [self didAccessValueForKey:@"preview"];
    if (preview == nil) {
        if ([self.body length] < 200) {
            preview = self.body;
        } else {
            preview = [self.body substringWithRange:NSMakeRange(0, 200)];
        }
        [self setPrimitiveValue:preview forKey:@"preview"];
    }
    return preview;
}

(Вы можете предоставить настраиваемые методы getter, setter для @dynamic-свойств. Однако Core Data свойства не просто подкрепляются переменными экземпляра. Вот почему вы не можете доступ _preview.)

Если вам нужно пересчитать preview, если изменяется атрибут body, тогда вы должен также реализовать собственный метод настройки для body, который устанавливает preview обратно на nil.

Для получения дополнительной информации прочитайте Нестандартные постоянные атрибуты в "Руководстве по программированию основных данных".

Обновление: Текущая версия Руководства по программированию основных данных больше не содержат эту главу. Вы можете найти архивную версию из Way Back Machine. Конечно, это нужно делать с зерно соли, поскольку оно не является частью официальной документации больше.

Ответ 2

См. документацию по использованию primitiveValueForKey:

в основном:

@dynamic name;

- (NSString *)name
{
    [self willAccessValueForKey:@"name"];
    NSString *myName = [self primitiveName];
    [self didAccessValueForKey:@"name"];
    return myName;
}

- (void)setName:(NSString *)newName
{
    [self willChangeValueForKey:@"name"];
    [self setPrimitiveName:newName];
    [self didChangeValueForKey:@"name"];
}