2

視覚的には、テーブルの並べ替え順序を変更する「モード」選択を許可する がありますUITableViewUISegmentedControl

を使用しNSFetchedResultsControllerて、異なるソート構成ごとに個別のコントローラーを保持し、現在選択されている「モード」に基づいて表示されているコントローラーを切り替える必要があると考えています。

NSFetchedResultsControllerただし、4 つの異なるすべてのデリゲート メッセージを送信して を更新すると、これが難しくなることがわかりますUITableView。これに対処するためswitch()に、関連する各メソッドでブロックを使用して、現在 'active' 以外のすべてを無視することを計画していますNSFetchedResultsController

これは正しいアプローチのように聞こえますか、それともここで明らかな何かが欠けていますか?

controllerWillChangeContent:- 更新が行われたときにユーザーが「モード」を変更した場合 (つまり、との間controllerDidChangeContent:) 、災害が発生する可能性があることがわかります。

4

2 に答える 2

2

セグメントコントロールを使用して、いくつかのCoreDataアプリの並べ替え/グループ化を変更しました。それらすべてで、私は常に単一のNSFetchedResultsControllerを使用し、セグメントが変更されたときにデータベースを再照会しました。

ご存知のとおり、この方法ははるかに単純な実装であり、予期しないエラーが発生する可能性が低く、スケーラブルでもあります。たとえば、顧客のフィードバックに基づいて新しい並べ替え/グループ化セグメントを追加することにした場合はどうなりますか?いくつのNSFetchedResultsControllerを追加し続けますか?ある時点(5または6)で、それはばかげたことになります。

また、上記のGraverのコメントでは、「アクティブなもの」をnilに設定することを除いて、すべてのデリゲートを設定できます(他のすべてのデリゲートをnilにするには、コードの多くの行を変更する必要があります。これにより、コードの保守が困難になります。 。

したがって、私の提案は、単一のNSFetchedResultsControllerであるより単純な実装を使用し、セグメントが変更されるたびにそれを再作成することです。キャッシュに関心がある場合は、セグメントごとに個別のキャッシュ名を使用できます。次のように連結することで、セグメントごとに一意のキャッシュ名を生成できます。

[NSString stringWithFormat:@"Cache_%d", segment_index]
于 2012-05-21T15:25:32.947 に答える
2

セグメント化されたコントロールの選択されたインデックスが変更された場合、並べ替え記述子と performFetch を変更する方が論理的ではありませんか?

self.fetchedResultsController.fetchRequest.sortDescriptors = [NSArray ... ];
于 2012-05-16T11:29:52.380 に答える