CoreDataからフェッチされた36行の配列があります。各行には、podNumber、pieceNumber、およびcolorNumberの3つの属性があります。
私がやりたいのは、6つのグループで結果をシャッフルすることです。各ポッドに6つのピースがあり、これらはそのグループ用にシャッフルされます。
私はこれを効率的に行うことができます。ただし、ランダム化された値でCoreDataを更新すると、パフォーマンスが著しく低下します。ループが完了するまでに1〜1.5秒かかると思います。
私は2つの方法を試しました:1)CoreDataから古い配列を削除し、新しい配列を追加します2)CD内の一意の行を検索して更新します
最初の方法の方が少し速いことがわかりました。誰かが私がこれをどのようにスピードアップできるかについて何か洞察を持っていますか?コアデータの大規模なバッチを更新するためのより効率的な方法はありますか?それをバックグラウンドプロセスにする必要がありますか?それはどのように機能しますか?
ありがとう。MJ
これが方法1です。
//Fetch them all and then delete them all
NSFetchRequest * fetchPieceColors = [[NSFetchRequest alloc] init];
[fetchPieceColors setEntity:[NSEntityDescription entityForName:@"PieceColors" inManagedObjectContext:managedObjectContext]];
[fetchPieceColors setPredicate:[NSPredicate predicateWithFormat:@"(game = %@)",games]];
[fetchPieceColors setIncludesPropertyValues:NO];
NSError * error = nil;
NSArray * pieceColor = [managedObjectContext executeFetchRequest:fetchPieceColors error:&error];
[fetchPieceColors release];
for (NSManagedObject * piece in pieceColor) {
[managedObjectContext deleteObject:piece];
}
NSError *saveError = nil;
[managedObjectContext save:&saveError];
//Add back
for (int b=0;b<6;b++) {
for (int j=0;j<6;j++) {
NSError *error;
NSManagedObject *fetchPieceColors = [NSEntityDescription
insertNewObjectForEntityForName:@"PieceColors"
inManagedObjectContext:managedObjectContext];
[fetchPieceColors setValue:[NSNumber numberWithInt:b] forKey:@"podNumber"];
[fetchPieceColors setValue:[NSNumber numberWithInt:j] forKey:@"pieceNumber"];
[fetchPieceColors setValue:[shuffledArray objectAtIndex:(b*6)+j] forKey:@"colorNumber"];
[fetchPieceColors setValue:games forKey:@"game"];
if (![managedObjectContext save:&error])
{
NSLog(@"Problem saving: %@", [error localizedDescription]);
}
}
}