Как выполнить операцию перед любым средством доступа @ synthesize'd? - PullRequest
2 голосов
/ 12 сентября 2011

Мои объекты модели загружаются из базы данных SQLite с отложенной загрузкой.Не спрашивайте почему, но код использует QuickLite для заполнения объектов, что означает, что некоторая домашняя работа должна быть выполнена до того, как аксессор используется в первый раз.

Я думал, наивночто valueForKey: и setValue:forKey: будут вызываться аксессорами @synthesize, так что я мог бы просто перегрузить эти 2 метода для заполнения объекта из БД, если это необходимо.К сожалению, это не работает: аксессоры @synthesize d явно не используют KVC для получения / установки представленного значения.

Поэтому мой вопрос: есть ли способ вызвать какой-либо код перед любым* Доступ к 1011 * возможен без записи всех получателей / установщиков?

1 Ответ

1 голос
/ 12 сентября 2011

Если бы ваши объекты модели были подклассом NSManagedObject, тогда ваши средства доступа использовали бы KVC (вы объявляете свойства, а затем используйте «@dynamic» вместо «@synthesize» в файле .m, чтобы указать, что средства доступа будут позаботиться о другом коде).

По сути, это звучит так, как будто вы повторно реализуете ошибочное поведение в Базовых данных.

Исходя из вашего комментария, я могу думать только о том, чтобы иметь своего рода прокси-объект, который содержит ваш реальный объект. Таким образом, ваш прокси-объект будет иметь единственное видимое свойство, которое является вашим реальным объектом, и в аксессоре для этого вы будете проверять, обращались ли вы в базу данных для этого конкретного объекта, если нет, занимайтесь уборкой. ,

Итак, ваши звонки будут

NSString *someProperty = proxyObject.realObject.someProperty;

В proxyObject, средство доступа для realObject:

if (beenToTheDatabase)
    return realObject;
else
{
    // Do your business
    beenToTheDatabase = YES;
    return realObject;
}

Является ли это более или менее трудоемким делом, чем ручное написание ваших методов доступа или миграция на основные данные, я не знаю.

...