Reputation: 43
I'm attempting to create a "Please wait" UIAlertView that will appear while my code is downloading and calculating some data, then disappear when it has finished. Specifically, it is parsing an xml file it receives from Geonames.org.
The alert works fine, and i have the Show statement before my code, followed by the dismiss statement. My problem, however, is that the screen dims as if it were about to show the alert, parses and uses the xml, then appears for a split second and dismisses, essentially rendering the alert useless!
Below is an excerpt of my code:
//Show Alert
UIAlertView *waitAlert = [[UIAlertView alloc] initWithTitle:@"Please Wait"
message:@"Determining your current suburb."
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:nil];
[waitAlert show];
//Activity Indicator
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.center = CGPointMake(waitAlert.bounds.size.width / 2.0f, waitAlert.bounds.size.height - 40.0f);
[activityIndicator startAnimating];
[waitAlert addSubview:activityIndicator];
[activityIndicator release];
//Reverse Geocode
//Parse xml
NSURL *apiUrl = [[NSURL alloc] initWithString:@"http://api.geonames.org/findNearbyPlaceName?lat=-34.032188&lng=151.084494&username=l_plater"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:apiUrl];
[xmlParser setDelegate:self];
[xmlParser parse];
[xmlParser release];
[apiUrl release];
[waitAlert dismissWithClickedButtonIndex:0 animated:YES];
[waitAlert release];
I would perform the calculations in a background thread, but i need these to be completed before the user is allowed to continue.
Thanks heaps in advanced, any help is much appreciated :)
Upvotes: 0
Views: 844
Reputation: 32681
That's totally normal.
NSXMLParser's initWithContentsOfURL download the data (at the specified URL) synchronously, so the download of the XML data is done in a blocking way.
Your main thread is then frozen until the data has finished downloaded and parsed.
You have to defer the download of your XML data in a separate thread, or much more efficiently, use NSURLConnection and its asynchronous download mechanism to download your XML data. Thus your main thread will continue executing without freezing, and your UIAlertView will be shown.
Then, after the download is done in the background, you will be asynchronously informed when the XML data has been downloaded, using the NSURLConnection delegate methods. That's the place to create your NSXMLParser, parse the data that has been asychronously downloaded, then dismiss your alertview once done.
Upvotes: 1