使用Core Data插入对象数组的内存有效方法

ran*_*its 7 iphone core-data

我正在为一个iPhone应用程序编写一段代码,该代码从服务器获取大量数据并在客户端上从中构建对象.它最终创建了大约40,000个对象.它们不会显示给用户,我只需要创建NSManagedObject的实例并将它们存储到持久存储中.

我认为这样做的唯一方法是创建单个对象,然后保存上下文,这是错误的吗?最好一次创建所有对象,然后以某种方式将它们创建并存储在某些集合或数组中后保存到上下文中?如果是这样,是否可以显示一些示例代码来说明这是如何完成的,或者指向我编写方向的方向?

对象本身是具有字符串或整数属性的相对直接的模型,并且不包含任何复杂的关系.

Jea*_*uys 5

在任何情况下,插入每个物体后都不要保存,或者为可怕的表演做好准备.

这是我在首次启动时用于填充Core Data存储库的代码.

#define MAX_UNSAVED_AIRPORTS_BEFORE_SAVE 1000
int numAirports = 0;
int numUnsavedAirports = MAX_UNSAVED_AIRPORTS_BEFORE_SAVE; // *** bug. see below
for (NSDictionary *anAirport in initialAirports) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Airport *newAirport = [NSEntityDescription insertNewObjectForEntityForName:@"Airport" inManagedObjectContext:managedObjectContext];

    newAirport.city         = [anAirport objectForKey:@"city"];
    newAirport.code         = [anAirport objectForKey:@"code"];
    newAirport.name         = [anAirport objectForKey:@"name"];
    newAirport.country_name = [anAirport objectForKey:@"country_name"];
    newAirport.latitude     = [NSNumber numberWithDouble:[[anAirport objectForKey:@"latitude"] doubleValue]];
    newAirport.longitude    = [NSNumber numberWithDouble:[[anAirport objectForKey:@"longitude"] doubleValue]];
    newAirport.altitude     = [NSNumber numberWithDouble:[[anAirport objectForKey:@"altitude"] doubleValue]];

    numAirports++;
    numUnsavedAirports++;
    if (numUnsavedAirports >= MAX_UNSAVED_AIRPORTS_BEFORE_SAVE) {
        if (![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
        numUnsavedAirports = 0;
    }
    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

另外不要忘记在循环后最后一次保存.

另请注意,如果满足以下所有三个条件,则存在导致崩溃的错误:

  1. 存储库是空的
  2. 你有一个UITableView与部分
  3. 您的第一个保存会保存多个对象.

在上面的代码的解决方法是初始化numUnsavedAirportsMAX_UNSAVED_AIRPORTS_BEFORE_SAVE,以确保后的第一个保存发生的第一次插入.

我希望这有帮助.