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

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;返回。望有人能解答,谢谢! : )

阅读 7.4k
3 个回答

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

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

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题