嘿,我正在创建一个iOS应用程序,要求用户使用用户名和密码登录,然后将此用户名和密码发送到Web服务器进行身份验证。当它发送请求并等待响应时,我会显示一个UIActivityIndicator。
我得到的问题是,有时UIActivityIndicator会立即出现在按钮按下,有时它只会在几秒钟后出现。猜测它是因为操作系统在更新UI之前正在执行另一个线程,但我想知道是否有人确切知道是什么原因造成这种延迟,或者只是因为我的代码有问题。
我的代码如下:
-(void)loginPressed:(id)sender{
if ([self validateForm]) {
[self startLoadingAnimation:@"CONNECTING"];
[Session theSession].authenicatedUsername = usernameTextField.text;
[Session theSession].authenicatedPassword = passwordTextField.text;
usernameTextField.text = @"";
passwordTextField.text = @"";
[self setUserDetailsBasedOnUserID:[Session theSession].authenicatedUsername password:[Session theSession].authenicatedPassword];
}else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"MISSING_LOGIN_DETAILS_TITLE", @"")
message:NSLocalizedString(@"MISSING_LOGIN_MESSAGE", @"")
delegate:self
cancelButtonTitle:NSLocalizedString(@"OK_BUTTON", @"")
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
由于
答案 0 :(得分:1)
您应该异步进行网络连接,否则,您将阻止主(UI)线程,同时可能需要等待很长时间才能使服务器响应(您不知道您的用户具有哪种连接等)。 / p>
如果您无法在后台线程或使用NSURLConnection的异步接口执行此操作,您可以先让runloop返回更新UI(启动活动指示器),然后启动任务,如下所示:
- (void)loginPressed:(id)sender {
[activityIndicator startAnimating];
[self performSelector:@selector(doLogin) withObject:nil afterDelay:0.0];
}
- (void)doLogin {
//perform your task here...
}
但正如我所说,这通常是不好的做法......