【发布时间】:2013-04-03 06:55:10
【问题描述】:
我有一个巨大的 NSArray(4.000.000 个对象),我想将其保存到 Core Data 中。 因为我使用 ARC 并且自动释放池可能会变得太大,所以我将进程划分为多个循环(这样自动释放池就有机会耗尽自身)。
在以下代码中,我使用管理器 (clMan) 从数组(区域)内的字典中添加项目。字典包含两个字符串字段,它们被解析为标量整数。
将数据划分为多个循环的代码
int loopSize = 50000;
int loops = 0;
int totalRepetitions = regions.count;
loops = totalRepetitions / loopSize;
int remaining = totalRepetitions % loopSize;
loops += 1;
for (int i = 0; i < loops; i++) {
int k = 0;
if (i == 0) k = 1;
if (i == (loops - 1))
{
// Last loop
for (long j = i * loopSize + k; j < i * loopSize + remaining; j++) {
[clMan addItemWithData:[regions objectAtIndex:j]];
}
[clMan saveContext];
break;
}
// Complete loops before the last one
for (long j = i * loopSize + k; j < (i + 1) * loopSize; j++) {
[clMan addItemWithData:[regions objectAtIndex:j]];
}
[clMan saveContext];
NSLog(@"Records added : %d", i * loopSize);
}
NSLog(@"Finished adding into core data");
将数据添加到核心数据中的代码:
-(void)addItemWithData:(NSDictionary *)data
{
MyRegion *region = [NSEntityDescription
insertNewObjectForEntityForName:@"MyRegion"
inManagedObjectContext:self.context];
region.index = [((NSString *)[data objectForKey:REGION_INDEX]) intValue];
region.id = [((NSString *)[data objectForKey:REGION_ID]) intValue];
}
程序在达到 1 500 000 索引时崩溃。由于解析问题/逻辑,崩溃似乎没有发生。
谁能告诉我我的逻辑是否错误,或者在 CoreData 中添加这么多数据的正确方法是什么?
【问题讨论】:
-
你有没有想过为此使用Magical Record?它具有非常好的自动从数组和字典导入数据的设置。
-
除非你将它们包装在
@autoreleasepool{}中,否则你的循环将无济于事。正如迈克尔·罗斯在他的回答中所建议的那样,您还需要resetMOC。
标签: ios objective-c database core-data