我在AFHTTPRequestOperation中使用AFNetworking时遇到问题。 responseObject在NSArray和NSDictionary之间交替。以下是我执行GET请求的方式:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:requestURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(responseObject[@"NotAvailableKey"];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
问题是当我试图访问未在NSArray对象中设置的字段时,我收到以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0xc1afaa0'
如果responseObject属于NSDictionary类型,则它可以正常工作。这是我得到的JSON:
(
{
"food_id" = 15;
"food_name" = "fish";
"user_admin_id" = 3;
ingredients = (
{
"ingredients_id" = 3;
"ingredients_name" = "salt";
}
);
}
)
答案 0 :(得分:1)
在使用之前,您可以检查responseObject
是NSDictionary
还是NSArray
。
if ([responseObject isKindOfClass:[NSDictionary class]]) {
NSLog([responseObject valueForKey:@"error"]);
}else if ([responseObject isKindOfClass:[NSArray class]]){
//This is an NSArray, you cannot call 'valueForKey' on this responseObject
}
<强>更新强>
正如@Sausages在评论中所指出的,这应该被用作恢复糟糕的服务器响应。您不应该处理来自单个服务器调用的多个对象类型具有正常行为或使用相同的方法来处理多个服务器调用返回根据其类型执行响应处理。
答案 1 :(得分:1)
AFNetworking只是您的应用和服务器之间的管道,您给人的印象是您认为其结果应该始终相同。
使用isKindOfClass也不是解决方案。当调用baseurl.com/methodOne时,您的代码应该知道调用baseurl.com/methodOne时的预期格式和内容,以及调用baseurl.com/methodTwo时它们的不同之处以及调用baseurl.com/methodN时的不同之处。
如果您正在调用baseurl.com/methodA,您应该知道服务器将数据作为数组返回以及它包含的内容,如果您调用baseurl.com/methodB,您现在应该知道它是一个字典以及它包含的内容。否则就是错误的方式。