2

次のようなモデルがあります。

コア データ モデル

UITableViewを使用して表示したいNSFetchedResultsController。でグループ化されObjectた、特定の のすべての をリストしたいと思います。たとえば、ある所有者のグループを表示する場合、テーブル ビューは次のようになります。OwnerGroupOwner A

Group A
  Object A
  Object B
  Object C
Group B
  Object A
  Object D
Group C
Group D
  Object C
  Object E

nameまた、グループがその属性 (上記のスキーマには示されていません)で順序付けられていること、およびNSFetchedResultsControllerオブジェクトが変更されたり、グループから追加/削除されたりするたびにデリゲート メソッドが呼び出されることも重要です。

これらの要件を考慮して、のような述語を使用して一連のNSFetchedResultsControllerをフェッチするように を設定しました。これにより、 「to-many key not allowed here」という例外がスローされます。他のいくつかの述語を試しましたが、行き詰まっています。Object[NSPredicate predicateWithFormat:@"ANY groups.owner = %@", someOwner]NSInvalidArgumentException

助言がありますか?これは私が使用すべきものではありませんNSFetchedResultsControllerか?または、データをモデル化するためのより良い方法はありますか?

ありがとう!

編集:実際に上記のコードで述語が機能するようになりました。私の間違いは私のsectionNameKeyPath議論にありました。を渡そうとしましたがgroups.name、これがエラーの原因でした。その方法がうまくいかない理由はわかりますが、望ましい結果を達成するための別の方法を見つけるのに苦労しています。おそらく結合オブジェクトですか?

編集 2:これは、次のような結合オブジェクトでうまく機能します。

結合オブジェクトを持つモデル

私が今見ている2つの欠点があります。1 つ目は、コードを使用して独自性を強制する必要があることです。それは簡単ですが、少し面倒です。2 つ目の欠点は、これを回避する方法がまだわかりませんが、 がNSFetchedResultsController更新のためにデリゲートを呼び出さObjectsないことです。私は今のところその欠点に耐えることができますが、より良い提案を聞いてうれしく思います.

4

2 に答える 2

1

あなたが見ようとしている問題は、オブジェクトを検索するフェッチされた結果コントローラーがある場合、各オブジェクトを一度だけ見つけることになると思います。したがって、各オブジェクトはテーブルに 1 回だけ表示されます。あなたがやりたいことは、物事を逆にしてすべてのグループを見つけてから、関連するすべての含まれているオブジェクトを表示することです。フェッチされた結果コントローラーに関しては、行を見つけてセクションに分割するのではなく、セクションを見つけて、何を行として提供するかを把握します。

最も簡単な方法は、Group でフェッチされた結果コントローラーを作成し、それらをセクションに再マップし、セクションごとの行として group.objects (適切に決定論的な並べ替えを適用) を提供する独自の中間オブジェクトを追加することだと思います。

行を動的にしたい場合、最も簡単な方法は、グループ コントローラーのフィードバックに基づいて、セクションごとにフェッチされた結果コントローラーを作成することだと思います。

それがすべて少し面倒で、独自のコレクションロジックを書きたいだけの場合は、NSManagedObjectContextDidSaveNotificationそれが発生するたびにロジックをキャッチして再実行することをお勧めします。メモリ効率の理由から、 のみを保持しobjectID、テーブル ビューがexistingObjectWithID:error:コンテキストのメソッドを介してそれらを要求した場合にのみ、適切なオブジェクトを取得することをお勧めします。Core Data には、メモリ警告に適切に応答するキャッシュ メカニズムが組み込まれているため、すべてが記述されています。

于 2012-12-18T01:40:40.587 に答える