Darshana
Darshana

Reputation: 314

handling the Response with the AFNetworking 2

i am really new to IOS development. i want to develop an application which is dealing with some web services and display in a table view. somehow i found a 3rd party library for do the networking stuffs [AFNetworking 2]. below is my code to get the json response for any given url and parameters.

-(NSDictionary*)getWebServiceResponce:(NSString *)url :(NSDictionary *)object
{

   // NSDictionary *parameters = [[NSDictionary alloc] initWithObjectsAndKeys:@"47", @"caregiverPersonId", nil];
  __block NSDictionary* result=Nil;
  __block NSString* person=Nil;


    AFSecurityPolicy *policy = [[AFSecurityPolicy alloc] init];
    [policy setAllowInvalidCertificates:YES];

    AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
    [operationManager setSecurityPolicy:policy];
    operationManager.requestSerializer = [AFJSONRequestSerializer serializer];
    operationManager.responseSerializer = [AFJSONResponseSerializer serializer];

    [operationManager POST:url
                parameters:object
                   success:^(AFHTTPRequestOperation *operation, id responseObject) {


                     NSLog(@"JSON: %@", [responseObject description]);
                       person = [responseObject[@"d"]objectForKey:@"PersonId"];
                     //  [self returnedResponce:responseObject];
                       result = (NSDictionary *) responseObject[@"d"];
                        NSLog(@"RESULT: %@", result);
                        NSLog(@"personm: %@", person);
                       [operation waitUntilFinished];
                   }
                   failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                       NSLog(@"Error: %@", [error description]);
                       //result = [error];
                   }
     ];

    return result;
    }

this code works perfectly.. but my point is when i put some breakpoints to check what are the values i got for several variables, it shows null. but my log shows the entire json response.

and i want to return my response object as a dictionary. because i want to do some process with the response.. can some one help me with this ?

Upvotes: 0

Views: 598

Answers (2)

Vibhu Srivastava
Vibhu Srivastava

Reputation: 146

[self webServiceResponceForURL:@"foo://foo" dictionary:nil success:^(NSDictionary *responseObject) {
    //your code here
}

Here you will got complete responseObject in form NSDictionary. You can assign responseObject to instance variable. Now This instance Variable will be used at point time. in your case, it will passed on button event.

Upvotes: 0

Maximilian Liesegang
Maximilian Liesegang

Reputation: 994

The problem is that result is nil when it gets returned. AFNetworking uses ObjC's awesome blocks, they get executed asynchronously. Read more about it here.

You should include a callback block in your getWebServiceResponce method. I've thrown together a bit of code but you should really read more about blocks.

-(void)webServiceResponceForURL:(NSString *)url dictionary:(NSDictionary *)object success:(void (^)(NSDictionary *responseObject))success {
// NSDictionary *parameters = [[NSDictionary alloc] initWithObjectsAndKeys:@"47", @"caregiverPersonId", nil];
__block NSDictionary* result=Nil;
__block NSString* person=Nil;

AFSecurityPolicy *policy = [[AFSecurityPolicy alloc] init];
[policy setAllowInvalidCertificates:YES];

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager setSecurityPolicy:policy];
operationManager.requestSerializer = [AFJSONRequestSerializer serializer];
operationManager.responseSerializer = [AFJSONResponseSerializer serializer];
[operationManager POST:url
            parameters:object
               success:^(AFHTTPRequestOperation *operation, id responseObject) {
                   NSLog(@"JSON: %@", [responseObject description]);
                   person = [responseObject[@"d"]objectForKey:@"PersonId"];
                   //  [self returnedResponce:responseObject];
                   result = (NSDictionary *) responseObject[@"d"];
                   NSLog(@"RESULT: %@", result);
                   NSLog(@"personm: %@", person);

                   //We are executing the block as soon as we have the results.
                   if (success) {
                       success(responseObject);
                   }
               }
               failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                   NSLog(@"Error: %@", [error description]);
                   //result = [error];
               }
 ];
}

Edit:

[self webServiceResponceForURL:@"foo://foo" dictionary:nil success:^(NSDictionary *responseObject) {
    //your code here
}

Upvotes: 1

Related Questions