2

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]);
        }
    }
}
4

2 に答える 2

1

timthetoolman が指摘したように、致命的なのはディスクをヒットする IO です。必要なことは、メモリ内のすべてのデータを取得し、編集を行ってから、一度にすべて保存することです。

の効率的なデータのインポートCore Data Programming Guideには、パフォーマンスを向上させるためにできることについて、いくつかの役立つヒントがあります。

于 2012-04-26T20:44:34.517 に答える
0

試しているいずれの方法でも、ネストされたループを実行した後に managedobjectContext を保存します。ディスクにヒットしてスローダウンを引き起こしているのは、MOC の保存です。数百または数千のオブジェクトを操作している場合を除き、その場合、MOC セーブをストライドする必要があります。

MOC は、保存するまですべての編集内容を保持するスクラッチ パッドです。そのため、操作が完了したら保存するまで待つことができます。

オブジェクトを削除して再作成することはしません。これは、ディスクへの不必要なスラッシングです。

幸運を

于 2012-04-26T20:33:42.493 に答える