我正在尝试创建一个“请等待”UIAlertView,它会在我的代码下载和计算某些数据时出现,然后在完成后消失。具体来说,它正在解析从Geonames.org收到的xml文件。
警报工作正常,我的代码前面有Show语句,后面是dismiss语句。然而,我的问题是,屏幕变暗,好像它要显示警报,解析并使用xml,然后一瞬间出现并解散,基本上使警报无用!
以下是我的代码的摘录:
//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];
我会在后台线程中执行计算,但我需要在允许用户继续之前完成这些计算。
非常感谢高级版,非常感谢任何帮助:)
答案 0 :(得分:1)
那是完全正常的。
NSXMLParser的initWithContentsOfURL同步下载数据(在指定的URL),因此XML数据的下载是以阻塞方式完成的。
然后冻结主线程,直到数据下载并解析完毕。
您必须在单独的线程中推迟下载XML数据,或者更高效地使用NSURLConnection及其异步下载机制来下载XML数据。因此,您的主线程将继续执行而不会冻结,并且将显示您的UIAlertView。
然后,在后台完成下载后,将使用NSURLConnection委托方法在下载XML数据时异步通知您。这是创建NSXMLParser的地方,解析异步下载的数据,然后在完成后关闭您的alertview。