ios Coredata大集插入

嘿,我坚持了相同的问题几天,插入时间逐渐增加,并在较低的iPad它也崩溃与内存问题。插入20Klogging需要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分钟才能存储20K条logging。 我已经把它带到了8秒(这真的很棘手!)与下面的代码:

  +(NSManagedObjectContext*)getInsertContext{ NSManagedObjectContext *thisContext=[[NSManagedObjectContext alloc] init]; AppDelegate *delegate=(AppDelegate*)[[UIApplication sharedApplication] delegate]; NSPersistentStoreCoordinator *coordinator = [delegate persistentStoreCoordinator]; [thisContext setPersistentStoreCoordinator:coordinator]; [thisContext setUndoManager:nil]; return thisContext; 

}

在我保存在这个上下文中的每1000条logging中,保存重置并重新获得新的上下文之后:

  [thisContext reset]; thisContext=[self getInsertContext]; 

原则上在启动时将种子数据插入数据库没有问题。 复制现成的核心数据数据库当然是快速的,但也很麻烦准备和保持更新。

这里有一些想法:

1)重写for循环,以便遍历批处理,并有一个内循环迭代logging。 将两个循环放入单独的@autoreleasepool方括号中。

2)当从字典中检索值时,考虑将valueForKey更改为objectForKey 。 差别是微妙的,但重要的。

3)澄清你的thisContext来自哪里。 它是应用程序的主要上下文还是子上下文。 在后一种情况下,保存实际上不会写入数据库,直到父母也保存。

4)考虑pipe理对象上下文的performBlock API,它给你额外的线程和内存的绝缘。

您应该随本数据库中已经创build的数据库一起发货。