UI不会立即显示微调器

时间:2011-01-13 16:28:01

标签: objective-c web-services nsurlconnection spinner

嘿,我正在创建一个iOS应用程序,要求用户使用用户名和密码登录,然后将此用户名和密码发送到Web服务器进行身份验证。当它发送请求并等待响应时,我会显示一个UIActivityIndi​​cator。

我得到的问题是,有时UIActivityIndi​​cator会立即出现在按钮按下,有时它只会在几秒钟后出现。猜测它是因为操作系统在更新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];
    }
}

由于

1 个答案:

答案 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...
}

但正如我所说,这通常是不好的做法......