我们想将一个巨大的 XML 文件 (13MB) 导入 Core Data。目前,XML 文件包含大约 64000 个条目,但这个数字将来会增加。
XML结构:
<entry name='...' doctype='' last-modified='...' [some more attributes] />
经过大量研究,包括XMLSchema 示例项目、Ray Wenderlich XML 教程和一些 stackoverflow 条目,我们还没有找到解决方案。
我们首先下载 XML-File,然后开始解析并将数据插入到CoreData
以下是我们的实现:
- (void)importXMLFile:(NSString*)fileName {
NSInputStream* theStream = [[NSInputStream alloc] initWithFileAtPath:fileName];
_theParser = [[NSXMLParser alloc] initWithStream:theStream];
_theParser.delegate = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[_theParser parse];
});
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"entry"]) {
Importer* __weak weakSelf = self;
NSManagedObjectContext* theContext = self.importContext;
[theContext performBlock:^{
CustomObject* mo;
// Create ManagedObject
// Read values from parsed XML element
dispatch_async(dispatch_get_main_queue(), ^{
// Call a handler, just for information "added object"
});
NSError *error = nil;
if ([theContext hasChanges] && ![theContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
} else {
DLOGError(error);
}
}];
}
}
使用这种方法,内存使用量会激增,导致崩溃。XML 文件似乎在Core Data
. 所以问题是:
是否可以处理部分 XML 文件(一次 fe 30 个条目),而不是保存到CoreData
然后继续解析?
或者更常见的问题:如何优化内存使用?