2016-06-22 6 views
0

私のデータモデルには、date(NSDate)とnumberOfBiscuits(NSNumber)という2つの属性を持つClickerRecordエンティティがあります。新しいレコードが追加されるたびに、numberOfBiscuitsの別の値を入力することができます。結果のサブセットに対して独立した計算を返す単一フェッチ要求を実行できますか?

現在、範囲内の毎日のフェッチ要求を行い、対応するNSExpressionを使用して、その日のすべてのnumberOfBiscuits値の合計を計算するビスケットの数の1日平均を計算します。

問題:非同期フェッチ要求を使用してメインスレッドをブロックしないようにしています。最初と最後のレコードの間に数日があるとかなり遅くなります。フェッチ要求は順番に実行されます。 また、すべてのレコードをメモリにロードして並べ替えや計算を実行することもできますが、レコードの数が非常に多くなると問題になる可能性があります。

したがって、私の質問:単一のフェッチ要求を行い、numberOfBiscuitsの1日合計のエントリを持つ辞書を取得するために、NSExpressionsを使用して各日付間隔のサブ述語のようなものを追加することは可能ですか? そうでない場合は、この状況ではどのような方法が推奨されますか?

私はサブクエリについて読んだことがありますが、私が理解している限り、このような使用は意図されていません。

これは私がSOに求めている最初の質問ですので、私は明確な方法でそれを書かれていることを期待:)

答えて

1

私は何を探していることはpropertiesToGroupByだと思う(Apple Docsを参照) NSFetchRequestですが、あなたの場合は実装するのが簡単ではありませんが、後ほど説明します。

それぞれの機会に消費されるビスケットのカテゴリを指定でき、これはエンティティのcategory属性に格納されているとします。次に、各カテゴリ(日付を無視して)のビスケットの合計数を取得するために、あなたは@sumを使用してNSExpression使用して指定することができます。

fetch.propertiesToGroupBy = ["category"] 

CoreDataは、グループの結果はcategoryで取得しますと計算されます各グループごとに別々に合計します。

あなたの場合の問題点は、(あなたがすでにdate属性から時間情報を取り除く場合を除き)、そこにあなたがして、グループにしたい日付間隔を表し一切属性がなく、CoreDataはあなたを聞かせていないということですグループ化する計算値を指定します。あなたのエンティティに新しいday属性を追加し、レコードを追加/更新して、それをグループで指定するたびに計算する必要があります。その後、別の間隔(週や月など)で平均を計算したい場合は、同じ問題に再度直面します。もう1つの欠点は、daysにはClickerRecordsしか含まれていないことです:ユーザがビスケットを消費しない日がある場合、その日の結果はフェッチに表示されません(つまり、平均を推測しません0)。結果を使用するときは、これを適切に処理する必要があります。

あなたの非同期フェッチをチューニングするか、提案するとおり、メモリ全体を読み込んで計算を行う方がよい場合があります。エンティティが2つの属性しか持たず、ユーザーがビスケットに完全に住んでいないと仮定すると、ボリュームはそれほど問題にならないはずです。

+0

実際、異なる間隔(週、月など)が問題になります。私はメモリ内で計算を行うことに頼るつもりです。エンティティはより多くの属性を持ちますが、フットプリントを低く抑えるために、これらの2つを取得します。うまくいけば、ほとんどのユーザーにとってボリュームは問題になることはありません。それ以外の場合は、fetchBatchSizeを追加する必要がありますか?あなたのご意見ありがとうございます! – Rygen

関連する問題