2011-01-13 5 views
0

안녕하세요, 사용자 이름과 비밀번호를 사용하여 로그인해야하는 iOS 앱을 만들고 있습니다.이 사용자 이름과 비밀번호는 인증 될 웹 서버로 전송됩니다. 요청을 보내고 응답을 기다리는 동안 UIActivityIndicator를 표시합니다.UI가 회 전자를 즉시 ​​표시하지 않습니다.

내가보기에 문제는 UIActivityIndicator가 곧바로 버튼을 눌렀을 때 나타나고 몇 초가 지나면 나타납니다. UI를 업데이트하기 전에 OS가 다른 스레드를 실행하고 있기 때문에 추측하고 있지만 누군가가이 언젠가 지연을 일으킬 수 있는지 또는 내 코드가 잘못되었음을 알고 있는지 알고 싶습니다. 아래

내 코드 :

-(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]; 
    } 
} 

감사

당신은 잠재적으로 서버가 응답 할 수있는 긴 시간을 기다리는 동안, 그렇지 않으면, 당신은 (주 (UI) 스레드를 차단하는 것, 비동기 네트워킹 않는해야

답변

1

사용자가 어떤 종류의 연결을 가지고 있는지 등을 알지 못합니다.)

NSURLConnection의 비동기 인터페이스를 사용하거나 백그라운드 스레드에서이 작업을 수행 할 수 없다면 우선 UI를 업데이트하고 (활동 표시기를 시작하는) runloop을 반환 한 다음 다음과 같이 작업을 시작하십시오.

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

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

하지만 말했듯이, 이것은 일반적으로 나쁜 관행은 ... 나는 그것을 필요 정확히 할 것 같다

+0

감사 OMZ. 안타깝게도 앱이 사용하는 모든 데이터가 최신 상태 여야하고 휴대 전화에 아무것도 저장할 수 없기 때문에 사용자 대기를해야합니다. – williamb

관련 문제