2016-10-21 6 views
2

ユーザー名とパスワードを入力する必要があるログイン画面を作成しようとしています。ログインボタンをクリックすると、詳細をサーバーに解析しています。コードはこちらjson解析中の制御フロー - 目的C

NSString *post = [NSString stringWithFormat:@"username=%@&password=%@",[_userNameText text],[_passwordText text]]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%lu" , (unsigned long)[postData length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"http://*******/*****/******/userLogin.php"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"sample data"]; 
    [request setHTTPBody:postData]; 

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
    [[session dataTaskWithRequest:request completionHandler:^(NSData *data , NSURLResponse *response , NSError *error){ 
     _requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
     NSLog(@"%@",_requestReply); 
    }] resume]; 

これまでのコードは意図したとおりに動作します。今、私は、サーバーから返された "requestReply"が "status"キーの値 "success"を持っているかどうかをチェックしたいと思います。だから私は次のコードで値を印刷しようとしました。

_responseData = _requestReply; 
    NSLog(@"%@" , _responseData[@"status"]); 

そしてここでは、コンソール出力

2016-10-21 06:44:03.424 QuizApp2[65724:1287972] (null) 
2016-10-21 06:44:03.501 QuizApp2[65724:1288003] {"status":"success","message":"Welcome admin","code":true} 

だ私はわからないが、私は構文解析が起こる前に、コードの最後の行が実行されていることを感じました。誰かがここでコントロールがどのように流れるのかを強調してもらえますかまたは、私のコードに何か問題がありますか?

+1

を;'?ブロック 'session dataTaskWithRequest'またはその外側にありますか? – Ti3t

+0

"resume"の直後。外部ブロック –

+1

実行中の場合、ブロックが非同期に実行されるため、 '_requestReply'にはデータがありません。あなたはブロック内にそれらの2行を置く場合、それは動作します – Ti3t

答えて

2

解析データについてのコードはありませんでした。 userLogin.phpはちょうどこれを行う、JSONデータを戻す場合は、この行に

_requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 

を意味するか:あなたは_responseData = _requestReply `呼ぶのです

[[session dataTaskWithRequest:request completionHandler:^(NSData *data , NSURLResponse *response , NSError *error){ 
    NSError *err = nil; 
    id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&err]; 
    if (err) { 
     NSLog(@"%@", err); 
    } 
    else { 
     NSLog(@"%@", jsonData[@"status"]); 
    } 
}] resume]; 
+0

ありがとうございます。これは実際には機能しましたが、私はどのように理解できるか分かりません。そして、なぜ私が "再開"が解析される前に実行された後に書き込む文がなぜ理解できないのですか?私はObjective Cを初めて勉強しました。 –