AFNetworking的问题

时间:2014-04-28 11:53:43

标签: ios json web-services afnetworking

我的客户端网络服务向我发送如下结果:

{"login":{"EMAIL":"none","ID":"none","NOME":"none"}}

所以,在AFN中不起作用。

但是,如果还有一个结果有效:

{"login":[{"EMAIL":"none","ID":"none","NOME":"none"},{"EMAIL":"none","ID":"none","NOME":"none"}]}

我的代码:

NSDictionary *paramLogin = [NSDictionary dictionaryWithObjectsAndKeys:_txtEmail.text, @"email",_txtSenha.text, @"senha", nil];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager GET:@"http://webservice.info" parameters:paramLogin success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"%@" , responseObject );

    for (NSDictionary *retLogin in [responseObject valueForKeyPath:@"login"]) {

        nome  = [retLogin objectForKey:@"nome"];
        email = [retLogin objectForKey:@"email"];


    }

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"Error: %@", error);

}];

为什么会这样?或者我该做什么?

4 个答案:

答案 0 :(得分:0)

如果你得到这样的回答而不是使用下面的代码

NSMutableArray *category = [[NSMutableArray alloc]init];
category = [responseObject objectForKey:@"login"];

 for(int i = 0; i < [category count]; i++)
 {
    NSDictionary *dic = [category objectAtIndex:i]; 
    nome  = [dic objectForKey:@"nome"];
    email = [dic objectForKey:@"email"];
 }

答案 1 :(得分:0)

有时候[responseObject valueForKeyPath:@"login"]会返回数组,有时它会返回一个字典。你需要对此进行测试。

id loginValue = [responseObject valueForKeyPath:@"login"];

if ([loginValue isKindOfClass:[NSDictionary class]]) {
    nome  = [loginValue objectForKey:@"nome"];
    email = [loginValue objectForKey:@"email"];
} else if ([loginValue isKindOfClass:[NSArray class]]) {
    for (NSDictionary *retLogin in [responseObject valueForKeyPath:@"login"]) {

        nome  = [retLogin objectForKey:@"nome"];
        email = [retLogin objectForKey:@"email"];


    }
} else {
    // ERROR: Unexpected value
}

如果您有1个值,则loginValue是NSDictionary。它包含{"EMAIL":"none","ID":"none","NOME":"none"}

如果您的值超过1,则loginValue是NSArray。该数组包含[<NSDictionary>, <NSDictionary>]。这些词典中的每一个都包含{"EMAIL":"none","ID":"none","NOME":"none"}

答案 2 :(得分:0)

问题在于您的json数据结构。这不一致。

{"login":{"EMAIL":"none","ID":"none","NOME":"none"}} 

此处[responseObject valueForKeyPath:@"login"]是一个NSDictionary个对象。

但是,

{"login":[{"EMAIL":"none","ID":"none","NOME":"none"},{"EMAIL":"none","ID":"none","NOME":"none"}]}

此处[responseObject valueForKeyPath:@"login"]NSArray。所以你的快速枚举工作。

最佳解决方案是让您的Web服务开发人员始终发送数组,即使“登录”只有一个对象。所以看起来应该是这样的,

{"login": [{"EMAIL":"none","ID":"none","NOME":"none"}]}  //notice square brackets

否则,当只有一个对象时,您必须修改代码以检查NSDictionary而不是数组。

答案 3 :(得分:0)

我怀疑问题是你没有保留AFHTTPRequestOperationManager对象。

假设此代码类似于viewDidAppear

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:...];

然后manager将在有机会完成之前销毁。

而是添加一个属性并将管理器对象存储在:

@interface MyViewController ()
@property (nonatomic) AFHTTPRequestOperationManager *manager;
@end

并使用:

self.manager = [AFHTTPRequestOperationManager manager];
[self.manager GET:...];