Пользовательский интерфейс не отображает счетчик мгновенно - PullRequest
0 голосов
/ 13 января 2011

Эй, я создаю приложение для iOS, которое требует от пользователя входа в систему с использованием имени пользователя и пароля, затем эти имя пользователя и пароль отправляются на веб-сервер для аутентификации. Пока он отправляет запрос и ждет ответа, я показываю UIActivityIndicator.

Проблема, которую я получаю, заключается в том, что иногда UIActivityIndicator сразу появляется при нажатии кнопки, а иногда - только через несколько секунд. Я предполагаю, потому что ОС выполняет другой поток перед обновлением пользовательского интерфейса, но я хотел бы знать, знает ли кто-нибудь наверняка, что может быть причиной такой задержки, или просто мой код виноват.

Мой код ниже:

-(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 Ответ

1 голос
/ 13 января 2011

Вы должны работать в сети асинхронно, в противном случае вы заблокируете основной поток (UI), потенциально ожидая ответа сервера в течение длительного времени (вы не знаете, какое соединение имеют ваши пользователи и т. Д.).

Если вы абсолютно не можете сделать это ни в фоновом потоке, ни с помощью асинхронного интерфейса NSURLConnection, вы можете сначала позволить своему runloop вернуться, чтобы обновить пользовательский интерфейс (запустить индикатор активности), а затем запустить задачу, например так:

- (void)loginPressed:(id)sender {
  [activityIndicator startAnimating];
  [self performSelector:@selector(doLogin) withObject:nil afterDelay:0.0];
}

- (void)doLogin {
  //perform your task here...
}

Но, как я уже сказал, это вообще плохая практика ...

...