質問

I have a problem handling an empty responseObject in the AFHTTPRequestOperation during the GET request. I'm using the AFNetworking Library.

If the content of the responsteObject is "0 objects" my application crashes when I'm trying to access keys which aren't available in the responseObject. How can I handle that gracefully? Here is how my code looks like:

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);
    }];

If the content of the responseObject is not "0 objects" the code works perfectly. Even if I'm trying to access a key which is not in the responseObject.

役に立ちましたか?

解決

Your code crashes because responseObject sometimes in not an NSDictionary. And so it not responds to objectForKey:. You should check what is a class of responseObject:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:requestURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    if ([responseObject isKindOfClass:[NSDictionary class]]
    {
         NSLog(responseObject[@"NotAvailableKey"]);
    }
    else
    {
         NSLog(@"Incorrect responseObject");
    }
}    
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

他のヒント

Use a conditional with [responseObject count]

    if ([responseObject count] == 0) {
        //do nothing
        return;
    }

You probably want to make sure that your response object is a dictionary before you try to access key-values. It might be being returned as an array which would crash with something like a "not key-value coded" exception.

You can try following:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:requestURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
  if ([responseObject respondsToSelector:@selector:(objectForKey:)]) {
     // Access the key you need to here.
     NSLog(responseObject[@"NotAvailableKey"];
  } else {

   // responseObject is unexpected. Handle the error case here.
  }

}    
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top