0

私のタイトルが私の質問を最もよく表しているかどうかはわかりませんが、より良いものを思いつきませんでした!

「トランザクション」と「分割」の 2 つの管理対象オブジェクトがあります。トランザクションは「分割」と 1 対多の関係にあるため、分割オブジェクトの NSSet があります。Split には、Category (NSString) と Amount (NSDecimalNumber) の 2 つのプロパティがあります。

トランザクションには、Split オブジェクトの NSSet を反復処理してすべての「Amount」プロパティを合計することで現在計算している値があります。

これは正常に機能しており、パフォーマンスの問題はないようですが、数千のトランザクションがある場合、これはうまくスケーリングしないと思われます。

私がする必要があると思うのは、Transaction オブジェクトに「Amount」プロパティを (キャッシュとして) 設定し、これを毎回更新して、NSSet に含まれる「Split」オブジェクトの 1 つの「Amount」プロパティに変更を加えることです。 .

私がこれまでのところ理にかなっていることを願っています..

私の質問は、これを達成するための最良の方法ですか? KVO が設計されたもののように感じますが、これまで実際に使用したことはありません。いずれかの分割の「金額」の値が変更され、それによって独自の値を再計算できる場合、トランザクション オブジェクトに通知する必要がありますか?

それとも、分割の Amount プロパティのセッターでこれを行う必要がありますか??

確かにこれは一般的な問題であり、非常に洗練された解決策が存在する問題ですか? アドバイスやサンプルコードは大歓迎です..?

乾杯

4

1 に答える 1

0

amountのセッターをオーバーライドしますSplit
このようにして、いつか最適化またはスケールアップする必要がある場合、1 対多の関係を逆のない関係に変更して、セットの作成を完全に保存することができます (逆を削除する場合の削除の強制)より複雑になります)。

コードは次のようになります。

//not tested
- (void) setAmount:(NSUInteger)amount
{
    [self willChangeValueForKey:@"amount"];
    [self setPrimitiveValue:@(amount) forKey:@"amount"];
    self.transaction.amount += amount;
    [self didChangeValueForKey:@"amount"];
}

編集 (@Tommy):

Split削除時には、以下の金額を差し引く必要があります。

- (void) prepareForDeletion
{
    self.transaction.amount -= self.amount;
}

また、コンテキスト マージ ポリシーの設定には細心の注意を払ってください。異なるコンテキストからのトランザクションへの変更が互いに上書きされないようにします (デフォルトのエラー ポリシーを使用してください)。

于 2013-04-19T14:57:07.350 に答える