2013-08-25 6 views
0

현재 기본 로그인 페이지를 사용하여 사용자가 앱에 액세스 할 수 있는지 확인하는 앱을 만들고 있습니다. 나는 간단한 웹 스크립트에서 사용자 이름과 암호를 사용하기 위해 this frame work을 사용하는 this tutorial의 도움으로 로그인 부분을 만들었습니다.SBJson 프레임 워크가있는 활동 표시기

다른 누군가가 문제를 해결하거나 도움을 줄 수 있기를 바랍니다. 나는 활동 지시자를 나타내지 않을 것이고, 나는 활동 지시자로서 MBProgressHUD을 사용하고있다.

그래서 실험 해 보았지만 앱이 URL에 연결할 때 활동 표시기를 표시 할 수 없습니다. 로그인 프로세스로 시뮬레이션 한 연결 상태가 좋지 않지만 앱이 URL에 연결하면 활동 표시기가 표시되지 않습니다. 오류시에만 표시되며 성공한로드 유형은로드가 완료 될 때까지 로그인 버튼이 눌려진 상태 (파란색 강조 표시된 상태)임을 나타냅니다. 때문에 sendSynchronousRequest:returningResponse:error:

이 방법의 사용에

// Login button 
- (IBAction)loginBtnClicked:(id)sender 
{ 
    // Show the activity indicator 
    [HUD showUIBlockingIndicatorWithText:@"Loggar in..."]; 

    @try { 
     if([[userNameTxtField text] isEqualToString:@""] || [[passwordTxtField text] isEqualToString:@""]) { 

      // No username or password entered 
      [self alertStatus:@"Du måste ange användarnamn och lösenord" :@"Något gick fel!"]; 

      // Hide activity indicator 
      [HUD hideUIBlockingIndicator]; 

     } else { 

      NSString *post =[[NSString alloc] initWithFormat:@"username=%@&password=%@",[userNameTxtField text],[passwordTxtField text]]; 
      NSLog(@"PostData: %@",post); 

      NSURL *url=[NSURL URLWithString:@"http://www.nebulon.se/json/sendus/jsonlogin.php"]; 

      NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

      NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

      NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
      [request setURL:url]; 
      [request setHTTPMethod:@"POST"]; 
      [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
      [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
      [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
      [request setHTTPBody:postData]; 

      //[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]]; 

      NSError *error = [[NSError alloc] init]; 
      NSHTTPURLResponse *response = nil; 
      NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

      NSLog(@"Response code: %d", [response statusCode]); 
      if ([response statusCode] >=200 && [response statusCode] <300){ 

       NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
       NSLog(@"Response ==> %@", responseData); 

       SBJsonParser *jsonParser = [SBJsonParser new]; 
       NSDictionary *jsonData = (NSDictionary *) [jsonParser objectWithString:responseData error:nil]; 
       NSLog(@"%@",jsonData); 
       NSInteger success = [(NSNumber *) [jsonData objectForKey:@"success"] integerValue]; 
       NSLog(@"%d",success); 

       if(success == 1){ 

        // Login success, grant user access to app 
        NSLog(@"Login SUCCESS"); 

        [self loginSuccess]; 

        // Hide activity indicator 
        [HUD hideUIBlockingIndicator]; 

        // Store username 
        NSString *userName = [userNameTxtField text]; 
        NSUserDefaults *UserDefaults = [NSUserDefaults standardUserDefaults]; 
        [UserDefaults setObject:userName forKey:@"userName"]; 
        [UserDefaults synchronize]; 

        [self dismissViewControllerAnimated:NO completion:nil]; 

       } else { 

        // Login error 
        NSString *error_msg = (NSString *) [jsonData objectForKey:@"error_message"]; 
        [self alertStatus:error_msg :@"Inloggningen misslyckades"]; 
        [self loginFailed]; 

        // Hide activity indicator 
        [HUD hideUIBlockingIndicator]; 
       } 

      } else { 

       // Login error 
       if (error) NSLog(@"Error: %@", error); 
       [self alertStatus:@"Ingen nätverksuppkoppling hittades." :@"Ett fel har inträffat!"]; 
       [self loginFailed]; 

       // Hide activity indicator 
       [HUD hideUIBlockingIndicator]; 
      } 
     } 
    } 
    @catch (NSException * e) { 

     // Login error 
     NSLog(@"Exception: %@", e); 
     [self alertStatus:@"Inloggningen misslyckades." :@"Ett fel har inträffat!"]; 
     [self loginFailed]; 

     // Hide activity indicator 
     [HUD hideUIBlockingIndicator]; 
    } 
} 

답변

0

내가 믿는 문제는 다음과 같습니다

그래서 여기에 사용자가 사용자 이름과 비밀번호를 입력했을 때 실행하고 로그인 버튼을 클릭 내 코드입니다 메인/UI 스레드를 차단하므로 메소드가 리턴 될 때까지 HUD가 실제로 표시 할 기회를 얻지 못합니다.이 시점에서 코드는 계속되고 HUD는 숨겨집니다.

저는 비동기 요청을 사용해야한다고 생각합니다. NSURLConnection 대리자 메서드 구현

편집 : 코드 샘플이 추가되었습니다.

iOS 5 이상을 타겟팅한다고 가정하면 sendAsynchronousRequest:queue:completionHandler: 및 GCD가있는 블록을 활용하는 다음 코드 스 니펫을 사용할 수 있습니다.

NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:backgroundQueue 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

          // NOTE: This block is called on the background queue. 

          // Use GCD to get back onto the main thread 
          dispatch_async(dispatch_get_main_queue(), ^{ 
           // This block will process the response and data on the main thread 
          }); 

         }]; 

은 정말 포트에이 메커니즘을 사용하는 기존 코드 아주 작은 작품이다. 블록 작동 방식을 모르는 경우 the documentation을 읽어보십시오. 이는 매우 강력한 언어 기능이며 점점 더 많은 양의 Apple 및 타사 프레임 워크에서 사용되고 있기 때문입니다.

이와 같은 문제를 일으킬 수있는 뉘앙스를 이해할 때까지 제 3 자 네트워킹 라이브러리의 AWAY 상태를 유지할 것을 권장합니다.

+0

@SteveWilford 위의 코드에 대한 제안을 구현할 수 있습니까? – Oskariagon

+0

@Oskar 나는 올바른 답을 줄 수있는 작은 코드 스 니펫을 포함하도록 내 대답을 편집했습니다. –

+0

제공 한 도움으로 해결하려고 노력할 것입니다. 그런데 메소드가 메인/UI 스레드를 차단하여 HUD가 메소드가 반환 될 때까지 표시하지 않는 이유는 무엇입니까? – Oskariagon