得到的数据如何直接赋值给外部变量?
在外面声明了一个字符串变量register_token,然后在task里面打印是有值得,在外面打印是null,必须要再创建一个model吗,我就想拿到这个regi_token的值
//创建会话任务
NSURLSessionDataTask *task1 = [session dataTaskWithRequest:rq_send_code completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 判断是否请求成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 如果请求成功,则解析数据。
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
// 判断是否解析成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 解析成功,处理数据,通过GCD获取主队列,在主线程中刷新界面。
NSLog(@"post success :%@",object);
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
});
//得到验证码的标识符
id id_code = [(NSDictionary *)object objectForKey:@"data"];
register_token = [(NSDictionary *)id_code objectForKey:@"register_token"];
NSLog(@"------------------%@",register_token); }
}}];
//执行任务
[task1 resume];
NSLog(@"------------------%@",register_token);
正在回答
1、首先说一下产生这个问题的原因:因为是异步线程,所以定一个全局变量在网络请求回来后的进行数据赋值,然后在主线程中打印,你会发现,这个全局变量是空值。因为异步线程消耗的时间是十秒,而主线程的执行时间是1秒,那么在主线程中不断打印,全局变量里面怎么可能有值,就会是空值。
2、解决方法:重写set方法,再set方法里打印。
这些是关于网络请求的所有代码内容,viewcontroller中有个按钮,按钮的响应方法就是这个-(void)send_verification_code函数;最后面的是打印的内容
@interface RegisteredWindowViewController (){
NSString *register_token;
}
- (void)viewDidLoad {
[super viewDidLoad];
register_token = [[NSString alloc]init];
}
-(void)send_verification_code{
//拿到手机号
[regist_tf_phonenumber resignFirstResponder];
NSString *phone_number = [regist_tf_phonenumber.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if(phone_number.length!=11){
[self showAlert:@"提示" message:@"请输入正确的手机号"];
}
else{
//请求发送验证码
NSURL *url_yj_sendcode = [NSURL URLWithString:@"http://123.207.85.37:8080/user/register_a.do"];
NSDictionary *parametersDict = @{@"token":@"sendCode",@"phone":phone_number};
//创建request请求
NSMutableURLRequest *rq_send_code = [NSMutableURLRequest requestWithURL:url_yj_sendcode];
//以“key=value&”的方式创建请求体
NSMutableString *parameterString = [[NSMutableString alloc]init];
int pos =0;
for (NSString *key in parametersDict.allKeys) {
// 拼接字符串
[parameterString appendFormat:@"%@=%@", key, parametersDict[key]];
if(pos<parametersDict.allKeys.count-1){
[parameterString appendString:@"&"];
}
pos++;
}
// NSLog(@"%@",parameterString);
NSData *parametersData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
//设置请求参数
[rq_send_code setHTTPMethod:@"POST"];
[rq_send_code setTimeoutInterval:8.0];
[rq_send_code setHTTPBody:parametersData];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
//创建会话任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:rq_send_code completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 判断是否请求成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 如果请求成功,则解析数据。
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
// 判断是否解析成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 解析成功,处理数据,通过GCD获取主队列,在主线程中刷新界面。
NSLog(@"post success :%@",object);
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
});
id id_code = [(NSDictionary *)object objectForKey:@"data"];
NSLog(@"请求体内部打印:%@",id_code);
self->register_token =[(NSDictionary *)id_code objectForKey:@"register_token"];
NSLog(@"请求体内部打印:%@",self->register_token);
}
}
}];
//执行任务
[task resume];
NSLog(@"请求体外部打印:%@",self->register_token);
}
}
@end
打印的内容:
2018-08-27 14:47:39.337542+0800 语境[44249:2504477] 请求体外部打印:
2018-08-27 14:47:39.399943+0800 语境[44249:2504477] Can't find keyplane that supports type 4 for keyboard iPhone-PortraitTruffle-NumberPad; using 6919991127445953680_PortraitTruffle_iPhone-Simple-Pad_Default
2018-08-27 14:47:39.539340+0800 语境[44249:2504579] [] nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004
2018-08-27 14:47:39.573061+0800 语境[44249:2504582] post success :{
data = {
"register_token" = F1A91D7460E3F7EBED719AEFB2AEC8DC;
};
msg = "\U53d1\U9001\U6210\U529f!";
status = 200;
}
2018-08-27 14:47:39.573354+0800 语境[44249:2504582] 请求体内部打印:{
"register_token" = F1A91D7460E3F7EBED719AEFB2AEC8DC;
}
2018-08-27 14:47:39.573580+0800 语境[44249:2504582] 请求体内部打印:F1A91D7460E3F7EBED719AEFB2AEC8DC
2018-08-27 14:49:39.460370+0800 语境[44249:2504582] Received XPC error Connection interrupted for message type 3 kCFNetworkAgentXPCMessageTypePACQuery
- 参与学习 150 人
- 解答问题 94 个
搞定网络多线程,掌握动画特效,熟悉第三方库等实用技术的使用,更有最新swift UI控件的讲解,让您不断丰富自己的开发技能。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星