私のiPADアプリケーションでは、Webサービスを呼び出してXML応答を取得し、解析してSQLiteデータベースに格納します。データを解析してSQLiteに挿入する - ios
解析と保存が正常に行われていますが、問題は動作に非常に時間がかかります。
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>
誰かができればそれは素晴らしいことです私がこれを手伝って、私が解析し保存する方法に何か問題があるかどうか教えてください。
これをInstrumentsで実行しましたか?リソースの使用状況を調査し、問題がどこにあるかを見つけるのに役立つ幅広いツールがあります。 –
私が正しいとすれば、私が直面しているリターンタグごとにmanagedObjectContextを保存するので、それは時間がかかる場所です。一度にすべてのオブジェクトを保存する別の方法がありますか? – learner2010