objective-C中,代码块block作为参数使用?
1.我用AFNetworking
与服务器交互,执行的方法中,参数success
和failure
使用了block
,请看如下代码:
__block NSString* res;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parametersDic = @{@"account" : account, @"pass" : password};
[manager POST:@"http://127.0.0.1/login.php" parameters:parametersDic
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
NSString *status = responseObject[@"status"];
if ([status isEqualToString:@"success"])
{
NSLog(@"登录成功!");
NSString *token = responseObject[@"info"][@"token"];
res = token;
}
else if ([status isEqualToString:@"erro"])
{
NSLog(@"登录失败!");
NSString *info = responseObject[@"info"][@"info"];
res = info;
NSLog(@"info:%@", info);
}
NSLog(@"注册函数中: %@", res);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@", error);
res = @"ERROR!!!";
}];
//sleep(2);
return res;
2.问题来了,我想利用一开始定义的NSString *res;
来获取解析得到的数据,然后return res;
来作为函数返回值。
3.但是参数使用了block
似乎是新开了一个线程,以success
为例,其中的token
数据赋值给res
后,只能作用于block
的那对花括号中,最后返回的return res
值为nil
。
4.我一开始以为是网络传输延迟没拿到数据,然后sleep(2);
后,依旧res
是nil
,然后我就想可能真的是线程问题。
5.我就想知道如何才能获取success
和failure
这两个block里面解析到的数据,然后作为函数返回值用return res;
返回。望有人能解答,谢谢! : )
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
1.用runloop
2.GCD group
见ios 想问一个很简单的异步问题
3.修改方法,直接返回block
你用的是AFHTTPRequestOperationManager,那个POST请求是一个异步操作,就是说,它会自己去处理请求,这里你调用POST函数之后就直接返回了,之后在请求结束的回调里赋res也没有用了。
如果你真的想要在success回调里面拿到token之后当作返回值的话,就只能把请求转成同步的了。一种是你直接用同步的请求网络的方法,一种是你自己实现把这个异步的请求转成同步的拿到结果后返回。
你写的代码逻辑有很多问题,你不熟悉block。你得在两个block中都返回,而不是在外面返回。最重要的是,你的返回写错地方,还有就是你的是立即返回的,并不是然block回调