2016-10-21 2 views
2

Я пытаюсь создать экран входа в систему, где нужно ввести его имя пользователя и пароль. При нажатии кнопки входа в систему я разбираю детали на сервере. Вот кодУправляющий поток во время разбора json - Objective 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», который возвращается с сервера, значение «успех» для его «статуса». Поэтому я попытался напечатать его значение с помощью следующего кода.

_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

где вы называете '_responseData = _requestReply;'? внутри блока 'session dataTaskWithRequest' или снаружи? – Ti3t

+0

сразу после «резюме». Вне –

+1

ahh, если это так во время его запуска, '_requestReply' не имеет данных, потому что блок работает асинхронно. Если вы поместите эти 2 строки внутри блока, он будет работать – Ti3t

ответ

2

Я не видел никакого кода о синтаксическом анализе. Вы имеете в виду эту линию

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

Если userLogin.php возвращает набор данных JSON, просто сделать это:

[[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. –

Смежные вопросы