В моем приложении iPAD я вызываю веб-сервис для получения XML-ответа, затем анализирую его и сохраняю в своей базе данных SQLITE.
Синтаксический анализ и сохранение происходят правильно, но у меня возникла проблемазаключается в том, что выполнение операции занимает очень много времени.
Используя Mac, я увидел количество записей, сохраняемых в базе данных.Это было 395 строк, где в каждой строке по 8 столбцов, т.е. около 3100 записей хранятся в моей базе данных (моя сущность имеет 8 атрибутов).На iPAD вся операция занимает около 25 секунд, что, как мне сказали, слишком долго.Я не могу понять, почему это занимает так много времени и где я ошибаюсь.
Это код, который я использую для анализа XML и хранения -
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"return"])
{
// Blank lab panel object
objLabPanel = [NSEntityDescription insertNewObjectForEntityForName:@"LabPanels" inManagedObjectContext:managedObjectContext];
mainElement = elementName;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
elementValue = [[NSMutableString alloc] init];
[elementValue appendString:string];
// Handle html codes
elementValue = [CommonHelper encodeHTMLCharactorsForDataBaseStorage:elementValue];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"return"])
{
[objPatient addLabPanelsObject:objLabPanel];
// Save
NSError *error = nil;
BOOL saveObj = FALSE;
saveObj = [managedObjectContext save:&error];
if (saveObj == FALSE)
{
NSLog (@"Error: %@", error);
}
}
else if ([elementName isEqualToString:@"batteryID"] && [mainElement isEqualToString:@"return"])
{
objLabPanel.labPanelBatteryId = elementValue;
}
else if ([elementName isEqualToString:@"batteryVersionNum"] && [mainElement isEqualToString:@"return"])
{
objLabPanel.labBatteryVersionId = elementValue;
}
else if ([elementName isEqualToString:@"conceptCode"] && [mainElement isEqualToString:@"return"])
{
objLabPanel.labPanelCode = elementValue;
}
else if ([elementName isEqualToString:@"conceptDescription"] && [mainElement isEqualToString:@"return"])
{
objLabPanel.labPanelDesc = elementValue;
}
else if ([elementName isEqualToString:@"effectiveEndTime"] && [mainElement isEqualToString:@"return"])
{
endDate = [CommonHelper getDateFromXMLString:[NSString stringWithString:elementValue] :@"yyyy-MM-dd'T'HHmmssZ"];
objLabPanel.labPanelEndDate = endDate;
}
else if ([elementName isEqualToString:@"effectiveStartTime"] && [mainElement isEqualToString:@"return"])
{
startDate = [CommonHelper getDateFromXMLString:[NSString stringWithString:elementValue] :@"yyyy-MM-dd'T'HHmmssZ"];
objLabPanel.labPanelStartDate = startDate;
}
else if ([elementName isEqualToString:@"body"])
{
// Release all variables at the end of xml parsing
[self releaseVariables];
}
elementValue = nil;
}
Вотобразец XML-кода, который я анализирую -
<return>
<batteryID>1234</batteryID>
<batteryVersionNum>1</batteryVersionNum>
<conceptCode>abc</conceptCode>
<conceptDescription>abc</conceptDescription>
<effectiveEndTime>2010-11-23</effectiveEndTime>
<effectiveStartTime>2010-11-23</effectiveStartTime>
</return>
<return>
<batteryID>2345</batteryID>
<batteryVersionNum>1</batteryVersionNum>
<conceptCode>bac</conceptCode>
<conceptDescription>bac</conceptDescription>
<effectiveEndTime>2010-11-23</effectiveEndTime>
<effectiveStartTime>2010-11-23</effectiveStartTime>
</return>
Было бы замечательно, если бы кто-то мог помочь мне с этим и сказать мне, если что-то не так с моим анализом и сохранением.