在UIAlertView show语句之后延迟执行代码,直到显示警报

时间:2011-06-22 12:32:41

标签: iphone objective-c ios4 uialertview

我正在尝试创建一个“请等待”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];

我会在后台线程中执行计算,但我需要在允许用户继续之前完成这些计算。

非常感谢高级版,非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:1)

那是完全正常的。

NSXMLParser的initWithContentsOfURL同步下载数据(在指定的URL),因此XML数据的下载是以阻塞方式完成的。

然后冻结主线程,直到数据下载并解析完毕。

您必须在单独的线程中推迟下载XML数据,或者更高效地使用NSURLConnection及其异步下载机制来下载XML数据。因此,您的主线程将继续执行而不会冻结,并且将显示您的UIAlertView。

然后,在后台完成下载后,将使用NSURLConnection委托方法在下载XML数据时异步通知您。这是创建NSXMLParser的地方,解析异步下载的数据,然后在完成后关闭您的alertview。