In my iPAD application, I call a webservice to get a XML response, then I parse it and store it into my SQLITE database.
The parsing and saving are happening properly, but the problem I am having is that it is taking a very long time for it to perform the operation.
Using the mac, I saw the number of records being saved to the database. It was 395 rows where each row has 8 columns in it i.e. around 3100 records are being stored to my database.(my entity has 8 attributes in it). On the iPAD, it takes about 25 seconds to do the whole operation, which I was told is too long.
I am unable to figure out why it is taking so long and where I am going wrong.
This is the code which I use for parsing the XML and storing -
- (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;
}
Here is a sample of the XML I am parsing -
<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>
It would be great if someone could help me out with this and tell me if something is wrong with the way I am parsing and saving.
You should save the MOC periodically, not for every insert. The MOC is saved when you ask for it to be saved, so it's up to you to determine when that is. Typically you should only save the MOC when it is consistent in terms of your needs (it's always consistent in terms of low-level relationships). I would wait until the end of parsing in any case.
Related
I'm new to this web service in iOS. I made a sample web service app and made the first stage login successfully. While checking the url in web after login I got this output :
<Rows>
<Row>
<style>LW6001TA</style>
<thumbnail1>
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
</thumbnail1>
</Row>
</Rows>
How to get these stuff back in Xcode and view it ? This is the first time I work on this web service I have no idea to get back this response back in Xcode. Please Help !
-(void)parseTheData
{
//Here convert your response to NSData type (NSData *data = [NSData data]; , i have used just for example)
NSData *data = [NSData data];
// Make sure that there is data.
if (data != nil) {
self.xmlParser = [[NSXMLParser alloc] initWithData:data];
self.xmlParser.delegate = self;
// Initialize the mutable string that we'll use during parsing.
self.foundValue = [[NSMutableString alloc] init];
// Start parsing.
[self.xmlParser parse];
}
}
//Delegate methods
-(void)parserDidStartDocument:(NSXMLParser *)parser{
// Initialize the array.
self.arrNeighboursData = [[NSMutableArray alloc] init];
}
-(void)parserDidEndDocument:(NSXMLParser *)parser{
// When the parsing has been finished then simply reload the table view or do what ever you want
}
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(#"%#", [parseError localizedDescription]);
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
// If the current element name is equal to "geoname" then initialize the temporary dictionary.
if ([elementName isEqualToString:#"Row"]) {
self.dictTempDataStorage = [[NSMutableDictionary alloc] init];
}
// Keep the current element.
self.currentElement = elementName;
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:#"thumbnail1"]) {
// Store the data like this
[self.dictTempDataStorage setObject:[NSString stringWithString:self.foundValue] forKey:#"thumbnail1"];
}
else if ([elementName isEqualToString:#"style"]){
// Store the data like this
[self.dictTempDataStorage setObject:[NSString stringWithString:self.foundValue] forKey:#"style"];
}
else if ([elementName isEqualToString:#"Row"])
{
//Add the dictionary in array and remove the data from dictionary, so that we can reuse the dictionary
[self.arrNeighboursData addObject:self.dictTempDataStorage];
self.dictTempDataStorage = nil;
}
// Clear the mutable string.
[self.foundValue setString:#""];
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
// Store the found characters if only we're interested in the current element.
if (![string isEqualToString:#"\n"]) {
[self.foundValue appendString:string];
}
}
Here I am just showing you the way to move on.
I want to parse the html tags inside the "comparison" node
<comparison>
Amazon.com
($34.36) |
Walmart.com
($34.36) |
Rakuten.com
($34.36) |
BestBuy.com
($34.36)
</comparison>
The output I am getting is:
BestBuy.com ($34.36)
The expected output:
Amazon.com ($34.36)
Walmart.com ($34.36)
Rakuten.com ($34.36)
BestBuy.com ($34.36)
But I want to display all the four items.
CODE
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
currentElementValue = [NSMutableString string];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
if ([elementName isEqualToString:#"item"]) {
dealsListObj = [[DealsParsingObjects alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[currentElementValue appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:#"short_title"]) {
dealsListObj.itemTitle = currentElementValue;
currentElementValue = nil;
}
else if ([elementName isEqualToString:#"final_price"]) {
dealsListObj.price = currentElementValue;
currentElementValue = nil;
}
//Detail view
else if ([elementName isEqualToString:#"merchant"]) {
dealsListObj.itemMerchant = currentElementValue;
currentElementValue = nil;
}
else if ([elementName isEqualToString:#"getdeal"]) {
dealsListObj.itemGetDeal = currentElementValue;
currentElementValue = nil;
}
//comparison
else if ([elementName isEqualToString:#"comparison"]) {
dealsListObj.comparison = currentElementValue;
currentElementValue = nil;
}
else if ([elementName isEqualToString:#"item"]) {
[resultArray addObject:dealsListObj];
[dealsListObj release];
dealsListObj = nil;
currentElementValue = nil;
}
}
It appears you have a DealsParsingObjects class with an NSMutableArray called commentsArray. You instantiate that array, when the parsing begins reading the <comparison> element.
But when the parser has read a <comparison> element, you assign the value to a property called comparison; it doesn't get added to the array. Being an default NSString property (assumption on my part), it simply gets reassigned each time the parser is done reading a <comparison> element.
Edit:
parser:didStartElement:... is called every time a new element is read. This also holds for the <a> tags. In that method you reset currentElementValue. So for each <a> the value is basically reset to an empty string. Only the last read value remains, which is the value of the last <a> tag plus the trailing text.
I have been trying to debug this error, and I can't find the issue. From what I have researched, I think that this is telling me that I am trying to release an object that has already been real eased, although I am not sure. I have a object that acts as the delegate for a NSXMLParser object, and I have a property of type NSMutableString that I use to hold the characters of each element. Here is my code:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
self.stringBuffer = [NSMutableString string];
if ([elementName isEqualToString:#"item"])
self.parsingPodcast = YES;
if (attributeDict)
self.currentAttributesDict = attributeDict;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (string) [self.stringBuffer appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if (self.parsingPodcast)
{
if ([elementName isEqualToString:#"title"])
{
self.currentPodcastObject.title = self.stringBuffer;
}
else if ([elementName isEqualToString:#"pubDate"])
{
self.currentPodcastObject.publishDate = self.stringBuffer;
}
else if ([elementName isEqualToString:#"summary"])
{
self.currentPodcastObject.summary = self.stringBuffer;
}
else if ([elementName isEqualToString:#"imageurl"])
{
self.currentPodcastObject.imgURL = self.stringBuffer;
}
else if ([elementName isEqualToString:#"enclosure"])
{
self.currentPodcastObject.audioURL = [self.currentAttributesDict objectForKey:#"url"];
self.currentPodcastObject.audioType = [self.currentAttributesDict objectForKey:#"type"];
}
else if ([elementName isEqualToString:#"itunes:duration"])
{
self.currentPodcastObject.duration = self.stringBuffer;
}
else if ([elementName isEqualToString:#"item"])
{
parserCompletionBlock(self.currentPodcastObject);
}
}
}
I've enabled zombies in the scheme, and used the zombie tool to try and find any over released object, but I haven't been able to find anything. Here is the output on the console
:malloc: *** error for object 0x10e7531f0: double free
*** set a breakpoint in malloc_error_break to debug
I have added the malloc_error_break breakpoint
The breakpoint stops on the setter method for the self.stringBuffer property. Can anyone help me out? I must be missing something. Thanks in advance for your help!
[NSMutableString string] is autorelease. you should retain when assigning it on self.stringBuffer.
self.stringBuffer = [NSMutableString string] retain]
I actually got this error because the memory in my phone was almost full. Once i cleared some apps in my phone, the error went away. Not sure if this is useful, but it definitely helped me.
Ok so basically, I am trying to parse a sub-element:
<element>
<sub element 1>
<sub element 2>
<sub element 3>
<element>
The current original document that I want to parse contain as below for example:
sub-element-content1: AB, CD, DE, & SOMETHING DISPLAYED.
I only managed to grab & SOMETHING DISPLAYED. I could not parse the whole sub-element.
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
currentNodeContent = (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//NSLog(#"CURRENT CONTENT: %#", currentNodeContent);
}
That is the 1st issue. The second issue that I am having is that there are supposed to be 11 items in reference to the above. But it only managed to grab 2 items. Please note that each item contains the sub-elements except that some sub-elements are null
Issues has been added: (null)-(null)-(null)
Issues has been added: sub-element-1 sub-element2 sub-element3
Below is portion of didEndElement:
if ([elementName isEqualToString:#"Issue"]) {
//add currentIssue object into issues array
[issues addObject:currentIssue];
NSLog(#"Issues has been added: %#-%#-%#", currentIssue.sub-element-1, currentIssue.sub-element-2, currentIssue.sub-element-3);
currentIssue = nil;
currentNodeContent = nil;
}
if ([elementName isEqualToString:#"sub element 1"]) {
currentIssue.sub-element-1 = currentNodeContent;
NSLog(#"sub element 1: %#", currentIssue.sub-element-1);
}
if ([elementName isEqualToString:#"sub element 2"]) {
currentIssue.sub-element-2 = currentNodeContent;
NSLog(#"sub element 2: %#", currentIssue.sub-element-2);
}
if ([elementName isEqualToString:#"sub element 3"]) {
currentIssue.sub-element-3 = currentNodeContent;
NSLog(#"sub element 3: %#", currentIssue.sub-element-3);
}
Your advice(s) and/or suggestion(s) are greatly appreciated.
Update 1:
Ok, I have solved the problem.
It appears that "currentIssue = nil" causes the object to lose its contents as I was able to print out the currentNodeContent.
So, by removing, currentIssue, I am now able to see all the supposed elements that I need.
But there is one more problem. I can see all the sub elements now, but there only one sub element left which was grabbed partially which I do not understand why.
For <sub element 1> , sub element 1 is not the elementName . The element name is sub.
- (XMLParserViewController *) initXMLParser {
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
return self;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:#"Books"]) {
appDelegate.books = [[NSMutableArray alloc] init];
}
else if([elementName isEqualToString:#"Book"])
{
aBook = [[Books alloc] init];
}
NSLog(#"Processing Element: %#", elementName);
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:string];
else
[currentElementValue appendString:string];
NSLog(#"Processing Value: %#", currentElementValue);
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:#"Books"])
return;
if([elementName isEqualToString:#"Book"])
{
[appDelegate.books addObject:aBook];
aBook = nil;
}
else if([elementName isEqualToString:#"name"])
{
aBook.name=currentElementValue;
}
else if([elementName isEqualToString:#"address"])
{
aBook.address=currentElementValue;
}
else if([elementName isEqualToString:#"country"])
{
aBook.country=currentElementValue;
}
currentElementValue = nil;
NSLog(#"%#",aBook.name);
NSLog(#"%#",aBook.address);
NSLog(#"%#",aBook.country);
}
Try this code eith your elements hope this works for you.... :)
Ok, I have solved the problem.
It appears that "currentIssue = nil" causes the object to lose its contents as I was able to print out the currentNodeContent.
So, by removing, currentIssue, I am now able to see all the supposed elements that I need.
Secondly, to make it work correctly, I initialized the array under "parserDidStartDocument" instead of "parserDidStartElement".
I have a file xml as this:
<data>
<first>
<city>
city
</city>
<people>
400
</people>
</first>
<size>
<width>
340
</width>
<height>
120
</height>
</size>
<description>
<temp>
sunny
</temp>
<people>
45
</people>
</description>
<description>
<temp>
cloudy
</temp>
<people>
90
</people>
</description>
I use for parsing this code:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
currentElement = [elementName copy];
if ([elementName isEqualToString:#"first"]) {
firstType = [[NSMutableDictionary alloc] init];
currentCity = [[NSMutableString alloc] init];
currentPeople = [[NSMutableString alloc] init];
}
if ([elementName isEqualToString:#"size"]){
currentSize = [[NSMutableDictionary alloc] init];
width = [[NSMutableString alloc]init];
height = [[NSMutableString alloc]init];
}
if ([elementName isEqualToString:#"description"]){
desc1 = [[NSMutableDictionary alloc] init];
temp1 = [[NSMutableString alloc]init];
people1 = [[NSMutableString alloc]init];
}
if ([elementName isEqualToString:#"description"]){
desc2 = [[NSMutableDictionary alloc] init];
temp2 = [[NSMutableString alloc]init];
people2 = [[NSMutableString alloc]init];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:#"first"]) {
[firstType setObject:currentType forKey:#"city"];
[firstType setObject:currentQuery forKey:#"people"];
[feed addObject:[firstType copy]];
}
if ([elementName isEqualToString:#"size"]){
[currentSize setObject:tempC forKey:#"width"];
[currentSize setObject:tempF forKey:#"height"];
[feed addObject:[currentSize copy]];
}
if ([elementName isEqualToString:#"description"]){
[desc1 setObject:temp1 forKey:#"temp1"];
[desc1 setObject:people1 forKey:#"people1"];
[feed addObject:[desc1 copy]];
}
if ([elementName isEqualToString:#"description"]){
[desc2 setObject:temp1 forKey:#"temp2"];
[desc2 setObject:people1 forKey:#"people2"];
[feed addObject:[desc2 copy]];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(#"found");
if ([currentElement isEqualToString:#"city"]){
[currentCity appendString:string];
}
else if ([currentElement isEqualToString:#"people"]) {
[currentPeople appendString:string];
}
else if ([currentElement isEqualToString:#"width"]){
[width appendString:string];
}
else if ([currentElement isEqualToString:#"height"]){
[height appendString:string];
}
else if ([currentElement isEqualToString:#"temp"]){
[temp1 appendString:string];
}
else if ([currentElement isEqualToString:#"temp"]){
[temp2 appendString:string];
}
else if ([currentElement isEqualToString:#"people"]){
[people1 appendString:string];
}
else if ([currentElement isEqualToString:#"people"]){
[people2 appendString:string];
}
}
- (void) parserDidEndDocument:(NSXMLParser *)parser {
NSLog(#"feed:%#",feed);
}
the result of nslog is:
feed:(
{
city = city;
people = 4004590;
},
{
width = 340;
height = 120;
},
{
temp = sunny;
people = "";
},
{ ///???? here there is an empty space
},
{
temp = cloudy;
people = "";
},
{
}
)
Now I don't understand why there is a space between first dictionary of desc 1 and desc2, and I don't know how "people" take the result of people1 and people2 in a single string
Can you help me?
I guess your problem is in duplicated chunks of code such as:
else if ([currentElement isEqualToString:#"temp"]){
[temp1 appendString:string];
}
else if ([currentElement isEqualToString:#"temp"]){
[temp2 appendString:string];
}
In this case your first part of code will executed twice and second never.
Check also another parts of your code, yo have several blocks with this issue.
You need to keep track of whether you are parsing the first occurrence of description within the data tag, or the second. This can easily be done with a boolean (if there are only two), or an integer (for multiple) that indicates which of the tags you are currently processing. Then, in the parser:didEndElement: method, you can assign the accumulated data to the correct dictionary based on the flag/counter.
The other possibility, which I use in my XML parsing, is to accumulate characters for one tag at a time, then when I encounter the closing element for that tag, store the characters into the containing element's Dictionary right then. In other words, when I encounter the endTag for temp, I will immediately assign it to the current description tag's dictionary. Then, when I encounter the ending tag for the description tag itself, I can close out that dictionary, set the flag/increment the counter, and continue on with the next tag that is to be parsed.
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// ... SNIP ...
if ( [ elementName isEqualToString:#"description" ] )
{
curDescription = [ [ NSMutableDictionary alloc ] init ] ;
}
// ... SNIP ...
accumulatedCharacters = [ [ NSMutableString alloc ] init ]
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// ... SNIP ...
if ( [ elementName isEqualToString:#"temp" ] )
{
[ curDescription setValue:accumulatedCharacters forKey:#"temp" ] ;
}
if ( [ elementName isEqualToString:#"description" ] )
{
// Save the curDescription object, then clear it for reuse on the next
// occurrence of the tag
[ curDescription release ] ;
curDescription = nil ;
}
// ... SNIP ...
[ accumulatedCharacters release ] ;
accumulatedCharacters = nil ;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
{
[ accumulatedCharacters appendString:string ] ;
}