0

我的课堂上有以下方法:

-(IBAction)loginToAccount:(id)sender {
 // Display the network activity status indicator
 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

 // Show the load indicator
 [self.loadIndicator startAnimating];
 self.loadIndicator.hidden = NO;
 self.loadLabel.hidden = NO;

 [usernameTextField resignFirstResponder];
 [passwordTextField resignFirstResponder];

 [self CheckLoginCredentials];
}

-(void)CheckLoginCredentials {
 NSString *APIURL = [[NSString alloc] initWithFormat:@"http://mysite.com/xml.xml"];
 NSURL *url = [[NSURL alloc] initWithString:APIURL];
 NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
 [APIURL release];
 [url release];

 [xmlParser setDelegate:self];
 [xmlParser parse];
}

当我发表评论[self CheckLoginCredentials]时, loadIndicator 得到动画并显示,但是当我取消评论时[self CheckLoginCredentials],loadIndicator 没有显示并且也usernameTextField/passwordTextField resignFirstResponder不起作用。

我究竟做错了什么?谢谢!

4

1 回答 1

2

我相信这-initWithContentsOfURL:是一个同步 url 连接,因此会阻塞它运行的线程,直到它完成。

因此,进度指示器不会显示,因为它要求正在运行的线程具有活动的运行循环。在主线程上使用同步 url 连接将阻塞该线程上的 UI,因此您将看不到进度指示器。

正确的方法是使用 NSURLConnection's

+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate

只需创建一个封装 API 请求的 NSURLRequest 对象,然后将其传递给 NSURLConnection 上的该方法。

然后实现委托回调以取回您的数据。

这种方法的优点是所有这些都在一个单独的线程上完成并为您处理,因此不会阻塞您的 UI。

于 2009-10-19T13:48:28.710 回答