首页 > Web开发 > 详细

NSURLSession中NSURLSessionDataTask中completionHandler的疑问

时间:2016-03-19 22:55:53      阅读:438      评论:0      收藏:0      [点我收藏+]

先解释一下下面代码的作用:

整个方法是判断是否登陆成功并返回判断结果。

使用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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!