我的客户端网络服务向我发送如下结果:
{"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);
}];
为什么会这样?或者我该做什么?
答案 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:...];