2011-09-12 13 views
2

私のモデルオブジェクトは、SQLiteデータベースから遅延ロードされます。理由は問いませんが、コードでQuickLiteを使用してオブジェクトを設定しています。つまり、アクセサーを初めて使用する前にいくつかのハウスキーピングを実行する必要があります。@ synthesize'dアクセサの前に操作を実行する方法は?

私は、必要であれば、私は単純に、DBからオブジェクトを埋めるために、これらの2つの方法をオーバーロードすることができるようにvalueForKey:setValue:forKey:は、@synthesize D「のアクセサによって呼び出されるであろうと、単純に、と思いました。残念ながら、それは動作しません: 'dアクセサは明らかに表現された値を取得/設定するためにKVCを使用しません。

私の質問は次のとおりです。@propertyにアクセスする前に、すべてのゲッター/セッターを書かずにコードを呼び出す方法はありますか?

答えて

1

モデルオブジェクトがNSManagedObjectのサブクラスだった場合、アクセサはKVCを使用します(プロパティを宣言し、.mファイルで '@synthesize'ではなく '@dynamic'を使用してアクセサが表示されることを示します)他のコードで世話をした)。

基本的には、コアデータのフォールト動作を再実装しているようです。

あなたのコメントに基づいて、私はこれを行うと考えることができる唯一の方法は、あなたの実際のオブジェクトを含む一種のプロキシオブジェクトを持つことです。したがって、プロキシオブジェクトには実際のオブジェクトである1つの可視プロパティがあり、それに対するアクセサでは、この特定のオブジェクトのデータベースに移動したかどうかを確認し、そうでない場合はハウスキーピングを行います。

だから、あなたの通話はproxyObject、realObjectのアクセッサ内

NSString *someProperty = proxyObject.realObject.someProperty; 

次のようになります。

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

これは手動であなたのアクセサを書くか、コアデータに移行するよりも、多かれ少なかれ努力であるかどうか、知りません。

+0

私はこれをやってみたいと思うし、アプリの次のメジャーリリースのためにそれを行うだろうが、今問題は、私がレガシーコードを扱っていることと、私は底からそれをリファクタリングしたくないということですアップ。どのようにコアデータパスをダウンせずにこの種の動作を取得するための任意のアイデア? – DaGaMs

+0

私の更新された答えの半分焼いたアイデア。 – jrturton

+0

ありがとう、それは面白いハックです...確かに私はその道を行くだろうが、それは私の質問に有効な答えです。 – DaGaMs

関連する問題