0

シナリオ

ItemListDetail (すべてのアイテムの異なるリストの価格を含む) の2 つのエンティティがあります。これは絶対に必要であり、Item エンティティに price 属性を提供することはできません。なぜなら、すべての項目がさまざまな動的リスト (小売、b2b など) に対してより多くの価格を持つことができるからです。

関係は次のとおりです。

Item (lists) <------->> (item) ListDetail

アプリの現在のアクティブ リストは動的に変化するため、現在のアクティブ リストを持つ整数変数があるとします: _ACTIVE_LIST_CODE_。item オブジェクトの価格が必要な場合は、Item クラスでヘルパー メソッドを使用します。

-(NSNumber*) getPrice {
    NSSet *lists=[self.lists filteredSetUsingPredicate: [NSPredicate predicateWithFormat:@"listId == %d",_ACTIVE_LIST_CODE_]]; 
    ListDetail *activeList=[[lists allObjects] objectAtIndex:0];
    return activeList.price;
}

問題

さまざまなセクションのいくつかのアイテムを選択して表示するために、NSFetchedResultController で UITableView を使用します。特にない。アクティブなリストのアイテムの価格を使用して、fetchedObjects を注文したいと思います。price が Item の属性である場合、次のように単純に並べ替え記述子をフェッチ リクエストに追加します。

[NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES];

しかし、前に述べたように、これは不可能です。価格は動的な属性です。

ソート記述子で一時的なプロパティを使用できる場合は、ヘルパー メソッドを使用してその場で計算された価格の一時的なプロパティを設定します。何もする必要はありません。

「lists.price」のような記述子でキーパスを使用することはできません (または、その方法がわからない可能性があります)。これは、対多関係であり、NSSet でモデル化されているためです。

いくつかの回避策を試しましたが、成功しませんでした:

1) _ACTIVE_LIST_CODE_ の変更を観察して、非一時的な属性でアイテムの価格を設定します。

2) フェッチ要求の後、テーブル ビューを表示する前に、一時的な「価格」プロパティを使用して、フェッチされたオブジェクトを含む真新しい配列を並べ替え、昇順の整数インデックス「i」に従って順序付けられた配列を反復し、この値を非一時的なオブジェクトに割り当てます。 Item エンティティのプロパティ「order」。フェッチ要求でソート記述子に「順序」を使用します。(このアプローチはここで説明されています: Re-ordering NSFetchedResultsController )

どちらも機能しますが、フェッチ結果に何千ものアイテムがあるため、パフォーマンスが低下します...何か考えはありますか?

4

1 に答える 1

0

ListDetail代わりにフェッチはどうですか?提案どおりに、適切な述語とソート記述子を使用して制限およびソートできます。

fetchRequest.predicate = 
  [NSPredicate predicateWithFormat:@"listID = %@", activeListCode];

fetchRequest.sortDescriptors = 
  @[[NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES]];

ここで、アイテムのいくつかの属性でグループ化することは、1 対 1 の関係であるため、単純で効率的です。フェッチされた結果コントローラーは次のsectionNameKeyPathようになります

@"item.category"
于 2013-07-23T20:12:07.887 に答える