0

を使用してNSFetchedResultsController、Core Data 構造から数千の結果を引き出し、それらを に表示していUITableViewます。キーワードによる検索、作成者による並べ替えなど、述語を使用してフェッチを実行し、更新されたデータを表示するオプションがいくつかあります。

表示する前に順番をランダムにシャッフルしたいと思います。NSArray完全に機能するメソッドでのカテゴリを作成しましたが、shuffleそのメソッドを呼び出し[self.fetchedResultsController fetchedObjects]ても効果はなく、データは変更されません。これは is が原因fetchedObjectsでありreadonly、コピーを作成する必要があると想定しています。

私はそのコピーを作成しましたが、ヒットした問題は、その新しいアレイをアレイと平和的に共存させることfetchedObjectsです。fetchedObjectsさまざまな詳細ビューに移動してコンテンツを変更できるので、コンテンツの順序が異なっていても、shuffledFetchedObjectsアレイと同期を維持する方法を確認しようとしています。

ここに私の単純な小さなshuffleカテゴリがあります:

- (NSArray *) shuffle {
    NSMutableArray *tmp = [NSMutableArray arrayWithArray: self];
    for (int i = [tmp count] - 1; i > 0; i--) [tmp exchangeObjectAtIndex: arc4random() % (i + 1) withObjectAtIndex: i];
    return [NSArray arrayWithArray: tmp];
}

これを達成するためにどのようなオプションがありますか?

4

2 に答える 2

2

fetchedObjectsフェッチ済み結果コントローラー (FRC)を変更する方法はありません。フェッチされたオブジェクトをシャッフルする代わりに、ランダムインデックスを使用して、FRC 行番号をテーブル ビューの行番号に、またはその逆にマップすることができます。

ただし、FRC の変更追跡機能が本当に必要ない場合は、単純なフェッチを行う方が簡単です。

NSArray *results = [context executeFetch:request error:&error];

結果をシャッフルします。

NSArray *shuffledResults = [results shuffle];

およびshuffledResultsデータ ソース メソッドnumberOfRows...とで使用しcellForRow...ます。そうすれば、同期を保つ必要はありません。

更新:セクションがある場合は、FRC と、シャッフルされたオブジェクトの配列の配列 (1. level はセクション番号、2. level は行番号) が必要です。次のように入力できます。

// ... after [frc performFetch:&error] ...
self.dataSource = [NSMutableArray array]; // a NSMutableArray property of your view controller
for (NSUInteger section = 0; section < [[frc sections] count]; section++) {
    NSArray *objects = [[frc sections][section] objects]; // all objects of this section
    [self.dataSource addObject:[objects shuffle]];
}

次に、 でcellForRowAtIndexPath、次のように配列にアクセスします。

NSManagedObject *obj = self.dataSource[indexPath.section][indexPath.row];

(完全に異なるアプローチは、属性「randomOrder」をエンティティに追加し、各オブジェクトに乱数を割り当て、「randomOrder」のソート記述子をフェッチ要求に追加することです。)

于 2013-03-12T10:56:37.277 に答える
1

shouldShowShuffled選択したフィルターに応じてオンとオフを切り替えるブール値を使用して、問題を解決することができました。になっている場合ONは、シャッフルされた FRC の結果のコピーから結果を表示します。になっている場合は、FRC から直接OFF表示します。fetchedObjects

配列が更新されるときはいつでも、シャッフルされたfetchedObjects配列を更新しているので、常に最新です。

于 2013-03-12T12:28:12.387 に答える