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

Реализация свойств переходных процессов

Я добавляю свойство переходного процесса к моему базовому приложению на основе данных, и я думаю, что чего-то не хватает. В редакторе модели данных я добавил свойство optional, transient, BOOL, называемое isUnderwater.

В моем заголовочном файле модели я добавил: @property (nonatomic) BOOL isUnderwater;, затем я реализовал эти методы в файле реализации:

- (BOOL)isUnderwater {
    ... implementation ...
    return (ret);
}
- (void)setIsUnderwater:(BOOL)isUnderwater {}

Но когда я пытаюсь использовать isUnderwater как условие в NSPredicate, я получаю эту ошибку: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath isUnderwater not found in entity <NSSQLEntity Wheel id=2>'.

Любые идеи?

Спасибо!

4b9b3361

Ответ 1

Во-первых, вы не можете использовать свойство transient в NSFetchRequest, которое идет против хранилища SQLite. Когда вы используете SQLite, NSFetchRequest переводится в sql и выполняется против базы данных задолго до того, как ваш переходный процесс когда-либо коснется.

Кроме того, вам не следует внедрять аксессуры, вместо этого вы должны использовать @synthesize.

Затем, если вы хотите установить свойство переходного процесса, вы должны установить его в -awakeFromFetch и/или -awakeFromInsert вместо переопределения получателя.

Затем ваше свойство должно называться underwater, а определение @property должно быть:

@property (nonatomic, retain, getter=isUnderwater) NSNumber *underwater;

Примечание. Несмотря на то, что вы объявляете его логическим в своей модели, он по-прежнему является NSNumber в коде.

Наконец, установка необязательного флага в свойство transient не имеет значения, так как в любом случае он будет отброшен.

Update

Если объекты находятся в памяти, вы можете применить дополнительные фильтры (даже против переходных свойств). Единственное ограничение заключается в том, что вы не можете использовать переходные свойства, когда вы отправляетесь в файл SQLite.

Например, вы можете выполнить NSFetchRequest, который загружается во всех сущностях. Затем вы можете сразу применить второй NSPredicate к возвращенному NSArray и далее фильтровать объекты вниз.