如何在任何@ synthesize'd访问器之前执行操作?

时间:2011-09-12 10:44:57

标签: objective-c ios key-value-observing

我的模型对象是从SQLite数据库延迟加载的。不要问为什么,但代码使用QuickLite来填充对象,这意味着必须在第一次使用访问器之前执行一些内务处理。

我天真地想,valueForKey:setValue:forKey:将被@synthesize'd访问者调用,这样我就可以简单地重载这两个方法来从db填充对象,如有必要。遗憾的是,这不起作用:@synthesize'd访问者显然不使用KVC来获取/设置其代表值。

我的问题是:有没有办法在访问任何@property之前调用某些代码,而不是自己编写所有的getter / setter?

1 个答案:

答案 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;
}

这是否比手动编写访问者或迁移到核心数据更多或更少,我不知道。