objective-C中,代码块block作为参数使用?

发布于 2022-09-01 21:25:26 字数 1769 浏览 16 评论 0

1.我用AFNetworking与服务器交互,执行的方法中,参数successfailure使用了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);后,依旧resnil,然后我就想可能真的是线程问题。

5.我就想知道如何才能获取successfailure这两个block里面解析到的数据,然后作为函数返回值用return res;返回。望有人能解答,谢谢! : )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

朮生 2022-09-08 21:25:26

1.用runloop
2.GCD group
ios 想问一个很简单的异步问题
3.修改方法,直接返回block

送舟行 2022-09-08 21:25:26

你用的是AFHTTPRequestOperationManager,那个POST请求是一个异步操作,就是说,它会自己去处理请求,这里你调用POST函数之后就直接返回了,之后在请求结束的回调里赋res也没有用了。

如果你真的想要在success回调里面拿到token之后当作返回值的话,就只能把请求转成同步的了。一种是你直接用同步的请求网络的方法,一种是你自己实现把这个异步的请求转成同步的拿到结果后返回。

老娘不死你永远是小三 2022-09-08 21:25:26

你写的代码逻辑有很多问题,你不熟悉block。你得在两个block中都返回,而不是在外面返回。最重要的是,你的返回写错地方,还有就是你的是立即返回的,并不是然block回调

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文