我的模型对象是从SQLite数据库延迟加载的。不要问为什么,但代码使用QuickLite来填充对象,这意味着必须在第一次使用访问器之前执行一些内务处理。
我天真地想,valueForKey:
和setValue:forKey:
将被@synthesize
'd访问者调用,这样我就可以简单地重载这两个方法来从db填充对象,如有必要。遗憾的是,这不起作用:@synthesize
'd访问者显然不使用KVC来获取/设置其代表值。
我的问题是:有没有办法在访问任何@property
之前调用某些代码,而不是自己编写所有的getter / setter?
答案 0 :(得分:1)
如果您的模型对象是NSManagedObject
的子类,那么您的访问者将使用KVC(您声明属性,然后在.m文件中使用'@dynamic'而不是'@synthesize'来指示访问者将由其他代码处理)。
基本上,这听起来像是在重新实现Core Data中的错误行为。
根据你的评论,我能想到的唯一方法是拥有一种包含你的实际对象的代理对象。因此,您的代理对象将具有单个可见属性,这是您的实际对象,然后在访问器中,您将检查是否已转到此特定对象的数据库,如果没有,请执行您的内务处理。
所以,你的电话将是
NSString *someProperty = proxyObject.realObject.someProperty;
在proxyObject中,是realObject的访问者:
if (beenToTheDatabase)
return realObject;
else
{
// Do your business
beenToTheDatabase = YES;
return realObject;
}
这是否比手动编写访问者或迁移到核心数据更多或更少,我不知道。