3

NSFetchedResultController によって管理されるテーブルビューがあります。最近追加されたレコードを取得したいので、コントローラーを次のように設定します。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timeStamp >= %@",someDate];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
request.sortDescriptors = [NSArray arrayWithObject:descriptor];
request.fetchLimit = 100;

そのため、結果は時間の降順で並べられます。しかし、結果を時間の昇順でテーブルビューに配置することも必要です。
結果を並べ替えるにはどうすればよいですか?

結果を別の配列に入れて並べ替え、フェッチ結果が更新されるたびに同じことを行いますか?

4

2 に答える 2

1

結果を配列に入れます...それを逆にしたい場合は、昇順をYESに設定して、配列を逆にします:

NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects];

常にフェッチするのではなく、それが最も簡単な方法だと思います!

于 2012-07-20T20:16:47.007 に答える
0

述語は、timeStamp が someDay 以上のエンティティに結果セットを制限します。

ソート記述子は、どのレコードを取得する必要があるかをフェッチ要求に通知し、指定された順序で実際にソート/表示します。

取得制限により、返されるエンティティは 100 個までです。

1000 件の一致があり、sortAscending が YES の場合、timeStamp より新しい最も古いレコードが返され、次に 2 番目に古いレコードが続きます。sortAscending が NO の場合、timeStamp よりも新しいレコードが返され、次に 2 番目に新しいレコードが返され、timeStamp よりも新しい最も古いレコードに向かって移動します (存在する場合は、100 番目に古いレコードに到達するまで)。

UIableViews と NSFetchedResultsControllers は非常に自然に連携します。NSIndexPaths の処理方法をわざわざ変更しない限り、フェッチされた結果コントローラーでバックアップされたテーブル ビューがある場合、基本的に順序付け、セクション、および挿入/削除アクションが渡されます。このような場合、結果セットを並べ替えようとする必要はありません。必要なもの、量、順序を CoreData に伝えれば、それが得られます。

期待どおりの結果を得るには (私が知る限り)、レコードを実際にどのように並べ替えるかを反映するように並べ替え記述子を変更するだけです。この場合、昇順を YES に設定すると、次のようになります。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timeStamp >= %@",someDate];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:descriptor];
request.fetchLimit = 100;

そして、それはそれを行う必要があります。この場合、セットを逆順にする必要はありません。

于 2012-07-20T21:46:13.093 に答える