如何在afnetworking中的AFHTTPRequestOperationManager请求中获得返回

Posted

技术标签:

【中文标题】如何在afnetworking中的AFHTTPRequestOperationManager请求中获得返回【英文标题】:how to get return in AFHTTPRequestOperationManager request in afnetworking 【发布时间】:2015-04-22 09:59:03 【问题描述】:

您好,我正在使用 AFHTTPRequestOperationManager 类从服务器获取响应但无法返回数据发布数据。方法返回首先执行然后成功数据来我想得到返回的值。

这是我的代码.h 文件

@interface ServerRequest : NSObject




-(NSString *) JsonData:(NSString *)newparams actionmethod:(NSString *)action parameters:(NSDictionary *)params;

.m

#import "ServerRequest.h"
#import "AFNetworking.h"

@implementation ServerRequest






-(NSDictionary *) getJsonData:(NSString *)anynewparams 
                 actionmethod:(NSString *)action 
                   parameters:(NSDictionary *)params 

    NSMutableDictionary *json = [[NSMutableDictionary alloc] init];

    NSString *url = @"http://gjkhdhdyi/ghdgd/Rest/";
    url = [url stringByAppendingString:action];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];

    [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

    manager.requestSerializer = requestSerializer;
    [manager 
    POST:weburl 
    parameters:params
    success:^(AFHTTPRequestOperation *operation, id responseObject) 

         NSLog(@"JSON: %@", responseObject);
         json=responseObject;
         // here i am getting data 

    

    failure:^(AFHTTPRequestOperation *operation, NSError *error) 
         NSLog(@"Error: %@", error);

    ];

    return json;    

现在我在导入后在我的 ViewController 类中调用这个方法,我这样调用

ServerRequest *servercall=[[ServerRequest alloc]init];
returninfo=[servercall getJsonData:nil actionmethod:@"loginuser?" parameters:inputs]
// here i want return data.

问题在这里没有得到回报。但在我得到的方法中。那么请求成功后如何获取json数据,该怎么做呢

【问题讨论】:

了解块以及如何使用它们。您尝试做的事情是不可能的。 你能告诉我我必须在哪里更改代码 您需要这样实现块,您可以将数据返回给调用函数getJsonData 不,请阅读有关块的信息,直到您自己得到答案。如果我给你工作代码,这根本不会帮助你,因为你的应用程序的其余部分将不再工作。您必须学习如何构建网络代码。真的。没有捷径。 @dasdom 是的,我们可以通过完成块来实现这一点 【参考方案1】:

您的请求方法使用块,它不会立即执行,而是被调度/调度,因此该方法在请求完成之前返回(因此 nil 值)您可以重构您的方法以使用成功/错误块:

.h 文件

-(void)getJsonData:(NSString *)anynewparams 
  actionmethod:(NSString *)action 
    parameters:(NSDictionary *)params 
    onComplete:(void (^)(NSDictionary *json))successBlock 
       onError:(void (^)(NSError *error))errorBlock;

.m 文件

-(void)getJsonData:(NSString *)anynewparams 
      actionmethod:(NSString *)action 
        parameters:(NSDictionary *)params 
        onComplete:(void (^)(NSDictionary *json))successBlock 
           onError:(void (^)(NSError *error))errorBlock 

    NSString *url = @"http://gjkhdhdyi/ghdgd/Rest/";
    url = [url stringByAppendingString:action];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];

    [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

    manager.requestSerializer = requestSerializer;

    [manager POST:weburl parameters:params
    success:^(AFHTTPRequestOperation *operation, id responseObject) 

         NSLog(@"JSON: %@", responseObject);
         successBlock(responseObject);
     

    failure: ^(AFHTTPRequestOperation *operation, NSError *error) 
         NSLog(@"Error: %@", error);
         errorBlock(error);
     ];

然后:

ServerRequest *servercall=[[ServerRequest alloc] init];
[servercall getJsonData:nil actionmethod:@"loginuser?" parameters:inputs onComplete:^(NSDictionary *json) 

    // return json ehre
 onError:^(NSError *error) 

    // handle error here
];

【讨论】:

我收到错误,当我添加 onComplete 时没有界面可见 [servercall getJsonData:nil actionmethod:@"loginuser?"参数:输入 onComplete:^(NSDictionary *json) // 返回 json ehre onError:^(NSError *error) 在这一行 你为什么不在成功块中直接return json @jace 做任何你想在成功块中做的事情,根据上面的答案,块外的值将始终为零。 如果你声明一个变量 outside 一个块,你只能修改它 inside 如果你在它前面加上 __block 修饰符.【参考方案2】:

你也可以这样尝试-

.h 文件

- (NSDictionary *) getJsonData:(NSString *)anynewparams actionmethod:(NSString *)action parameters:(NSDictionary *)params onComplete:(void (^)(NSDictionary *json))successBlock
              onError:(void (^)(NSError *error))errorBlock;

.m 文件

-(NSDictionary *) getJsonData:(NSString *)anynewparams actionmethod: (NSString *)action parameters:(NSDictionary *)params
                onComplete:(void (^)(NSDictionary *json))successBlock
                   onError:(void (^)(NSError *error))errorBlock
__block id json;

NSString *url = @"http://gjkhdhdyi/ghdgd/Rest/";
url = [url stringByAppendingString:action];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];

[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
manager.requestSerializer = requestSerializer;

[manager POST:url parameters:params
      success:^(AFHTTPRequestOperation *operation, id responseObject)
 
     successBlock(responseObject);
 
 failure:
 ^(AFHTTPRequestOperation *operation, NSError *error)
     NSLog(@"Error: %@", error);
 ];
return json;

在 ViewController 类中调用此方法

-(void)call_LoginWebService
 returninfo=[[NSDictionary alloc]init];

BaseRequest *basecall=[[BaseRequest alloc]init];
[basecall getJsonData:nil actionmethod:@"LoginUser?" parameters:inputs onComplete:^(NSDictionary *json) 

    NSLog(@"alll data here  ==%@",json);
    returninfo = json;

 onError:^(NSError *error) 
    // handle error here
];

【讨论】:

你确定吗?在.m 中,您创建了一个变量__block id json,但从未实际分配它。在方法调用中,您将响应的值分配给resultInfo,它不是__block 变量。 @JózsefVesza 我试过这段代码,它对我来说很好用。你也可以试试告诉我 没关系,但是在.m 中,您根本不使用返回值(甚至没有设置它),所以我想说它很容易成为无效。如果你真的想返回结果,你可以等到成功块使用调度组执行。 @JózsefVesza return json 将始终返回字典结果,因为它是 id 而在方法中它是字典 我明白这一点。检查您的方法实现。您创建变量:__block id json;,然后将其返回 return json;,但您从未为其赋值。

以上是关于如何在afnetworking中的AFHTTPRequestOperationManager请求中获得返回的主要内容,如果未能解决你的问题,请参考以下文章

无法保存 AFNetworking 响应对象

使用 AFNetworking 2 和可达性没有互联网连接警报

使用 AFNetworking 2.0 发送 POST 数据

Afnetworking 返回 null json 尽管它是有效的

将资产视频发送到 Web 服务 - iOS

网络连接丢失。NSURLErrorDomain Code=-1005