2

ねえ、私は何日も同じ問題に悩まされています.挿入の時間が徐々に増加し、下位のiPadでもメモリの問題でクラッシュします.20kレコードを挿入するには4〜5分かかります.バックグラウンドスレッドが効率を向上させます. ? とにかくこれを最適化できますか。できれば助けてください。

  +(BOOL) addObjectToProfessionalsDBWithDict:(NSArray*)profArray{

if (!([profArray count]>0 && profArray )) {
    return NO;
}

NSManagedObjectContext *thisContext=[self getManagedObjectContext];


for (int i=0; i<[profArray count]; i++) {
  NSManagedObject *professionalDBObject = [NSEntityDescription
    insertNewObjectForEntityForName:@"ProfessionalsDB"
                                          inManagedObjectContext:thisContext];//initWithDictionary:objectDict];        NSMutableDictionary * objectDict=[profArray objectAtIndex:i];
 [professionalDBObject setValue:[objectDict valueForKey:@"Degree"] forKey:@"degree"];
[professionalDBObject setValue:[objectDict valueForKey:@"First_Name"] 
  // and 10 more  values  

     if(i%500==0){
        NSError *error;
        NSLog(@"saved rec nu %d",i);
        if (![thisContext save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
            return NO;
        }
        else{
            NSLog(@"data saved");

        }

         [thisContext reset];


   }

}



[prefs setInteger:numOfRecords forKey:@"numberOfRecords"];
NSError *error;


if (![thisContext save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    return NO;
}

return YES;

}

4

3 に答える 3

2

起動時にシードデータをデータベースに挿入することは原則として問題ありません。既製の Core Data データベースをコピーするのは確かに高速ですが、準備と更新の維持は面倒です。

ここにいくつかのアイデアがあります:

1) for ループを書き直して、バッチを反復処理し、内部ループでレコードを反復処理するようにします。両方のループを別々の@autoreleasepool括弧で囲みます。

2)ディクショナリから値を取得するときに に変更valueForKeyすることを検討してください。objectForKey違いは微妙ですが、重要です。

thisContext3) あなたの出身地を明確にします。アプリのメイン コンテキストか子コンテキストか。後者の場合、親も保存するまで、保存は実際にはデータベースに書き込みません。

performBlock4)追加のスレッドとメモリの分離を提供する管理オブジェクトコンテキストのAPIを検討してください。

于 2013-08-31T19:15:58.810 に答える