我无法找到令人满意的答案,所以写了一个新问题。
当我的应用程序第一次启动时,我需要将数据填充到coredata DB并且大小非常大(大约10mb),有多个文件,所有这些都需要插入到coredata中。
现在我的问题是我在处理4或5 MB后得到内存警告。创建的实体似乎仍然存在,我希望一旦完成一大块数据就清除它们(因为它是我可以在每个文件后清除的多个文件)。
这个问题不允许我完成进程,并且由于内存过载而总是崩溃。
我正在使用iPad mini和最新的xcode和ARC。
任何帮助表示感谢。
答案 0 :(得分:0)
首先在加载页面之前删除所有对象。删除后,插入核心数据中所有对象的数据。
- (void) deleteAllObjects: (NSString *) entityDescription {
LoginAppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
self.managedObjectContext = appDelegate.managedObjectContext;
NSManagedObjectContext *context =[appDelegate managedObjectContext];
NSEntityDescription *entityDesc =[NSEntityDescription entityForName:entityDescription
inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:request error:&error];
for (NSManagedObject *managedObject in items) {
[managedObjectContext deleteObject:managedObject];
//NSLog(@"%@ object deleted",entityDescription);
}
if (![managedObjectContext save:&error]) {
//NSLog(@"Error deleting %@ - error:%@",entityDescription,error);
}
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
[self deleteAllObjects:@"Data"];
//do ur code
[self insertYourData];
}
答案 1 :(得分:0)
为什么不简单地创建一个临时上下文,插入一部分数据(可能只有一个实体),然后保存它,将其设置为nil并创建另一个?或者您可以尝试使用"重置"方法,我从来没有尝试过,但据我所知,它使上下文"忘记"所有对象,所以它应该像解除分配它们一样工作。