先解释一下下面代码的作用:
整个方法是判断是否登陆成功并返回判断结果。
使用JSON格式的数据发送账号密码到后端,并得到一个JSON,里面包括登陆是否成功的信息,LoginState为0成功,其他为失败
其中NSURLSessionDataTask是异步执行的
疑问在注释中
-(NSInteger)postLoginJson:(NSString *)url withStuid:(NSString *)stuid withPwd:(NSString *)pwd{
NSDictionary *dic = @{@"stuid":stuid,@"pwd":pwd};
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSURL *URL = [NSURL URLWithString:url];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/jason" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:data];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data,NSURLResponse *response,NSError *error){
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//其中 setBool 有bug
NSLog(@"loginState:%@",dic[@"loginState"]); //这是一个输出,返回状态值。
if([dic[@"loginState"] integerValue] == 0){
[userDefaults setInteger:0 forKey:@"tempBool"];
[userDefaults synchronize];
}
else{
[userDefaults setInteger:1 forKey:@"tempBool"];
[userDefaults synchronize];
}
}];
[task resume];
while ([task state] != NSURLSessionTaskStateCompleted) {
NSLog(@"state %ld",(long)[task state]);//这也是一个输出,当未完成时,一直输出。
} //此段代码是为了让任务完成后再往下执行,但无论如何,都是先输出willReturn而不是loginState
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSInteger willReturn = [userDefaults integerForKey:@"tempBool"];
NSLog(@"willReturn %ld",(long)willReturn);//这是函数返回值
[userDefaults removeObjectForKey:@"tempBool"];
[userDefaults synchronize];
//NSLog(willReturn);
return willReturn;
}
最终输出的结果就是:
先是一堆 while中的state
然后willReturn
然后loginState
按道理不是应该先loginState先输出吗?
NSURLSession中NSURLSessionDataTask中completionHandler的疑问
原文:http://www.cnblogs.com/Thkeer/p/5296556.html