-3

I want to wait until server reponse and parse XML done, then call another function. How can i do that? I used this code to send request to server and use NSXMLParser to parse XML response.

NSURL *url1 = [NSURL URLWithString:@"linkserver"];

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL: url1] ;
    NSDictionary *params1 = @{
                              @"a" : vd;
                              @"b" : @"all"

                              };

    NSMutableURLRequest *afRequest = [httpClient requestWithMethod:@"GET" path:nil parameters:params1] ;

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest];

    [operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success");
        NSString * parsexmlinput = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

        [self parseXMLFile:parsexmlinput];// parse xml


        [self getItemFromStatus];// wait to call another function at here???

    }
       failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                          NSLog(@"error: %@", error);

                                      }
     ];
        [httpClient enqueueHTTPRequestOperation:operation];
}

Please give me any suggestion. Thanks much

Master Stroke
  • 5,108
  • 2
  • 26
  • 57
Thoa Huynh
  • 23
  • 2
  • 8

3 Answers3

1

You have to make your request synchronous.

refer code something like:

 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.twitter.com/1.1/friends/ids.json?"]
                                                               cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                           timeoutInterval:10];

        [request setHTTPMethod: @"GET"];

        NSError *requestError;
        NSURLResponse *urlResponse = nil;


        NSData *response1 = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];
Preetam Jadakar
  • 4,479
  • 2
  • 28
  • 58
1

check this tutorial Ray Wenderlich using AFnetworking.

Using blocks and callbacks

- (IBAction)xmlTapped:(id)sender{
NSString *weatherUrl = [NSString stringWithFormat:@"%@weather.php?format=xml",BaseURLString];
NSURL *url = [NSURL URLWithString:weatherUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFXMLRequestOperation *operation =
[AFXMLRequestOperation XMLParserRequestOperationWithRequest:request
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {

        XMLParser.delegate = self;
        [XMLParser setShouldProcessNamespaces:YES];
        [XMLParser parse];
    }
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                     message:[NSString stringWithFormat:@"%@",error]
                                                    delegate:nil
                                           cancelButtonTitle:@"OK"
                                           otherButtonTitles:nil];
        [av show];
}];

    [operation start]; 
}
HernandoZ
  • 742
  • 2
  • 12
  • 24
0

You can do it in synchronous way...

NSURLResponse *response = nil;
   NSError *error = nil;

   NSURL *url = [NSURL URLWithString:urlStr];

 AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

   httpClient.parameterEncoding = AFFormURLParameterEncoding;

   NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:[url path] parameters:params];
   NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
 NSString * parsexmlinput = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

   if(error) {
      errorCallback(error, nil);
   } else {
      //parse the xml here
   }

OR

You can achive it by adding [operation waitUntilFinished],after it's added to the operation queue.Refer this==>Can AFNetworking return data synchronously (inside a block)?

OR

EDIT: In case you don't want to use the AFNetworking library.I prefer this way.

 NSString *action_Post =[[NSString alloc] initWithFormat:@"authToken=%@",theMutableString];
NSURL *action_Url =[NSURL URLWithString:@"ur url here"];

NSData *action_PostData = [action_Post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *action_postLength = [NSString stringWithFormat:@"%d", [action_PostData length]];//your parameter to be posted here

NSMutableURLRequest *action_Request = [[NSMutableURLRequest alloc] init];
[action_Request setURL:action_Url];
[action_Request setHTTPMethod:@"POST"];
[action_Request setValue:action_postLength forHTTPHeaderField:@"Content-Length"];
[action_Request setValue:@"application/xml" forHTTPHeaderField:@"Accept"];
//[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[action_Request setHTTPBody:action_PostData];
NSURLResponse *action_response;
NSData *action_Result = [NSURLConnection sendSynchronousRequest:action_Request returningResponse:&action_response error:&error];
if (!action_Result)
{
    NSLog(@"Error");
}
else
{
//Parse your xml here
//call ur function
}

Modify it according to your GET/PUT methods.But i suggest you to go for POST method,as it is refered to be as secured one.

Community
  • 1
  • 1
Master Stroke
  • 5,108
  • 2
  • 26
  • 57
  • i tried but it not works .... [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:afRequest returningResponse:&response error:&error]; NSString * parsexmlinput = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; – Thoa Huynh Aug 21 '13 at 07:58
  • Why wouldn't you use `AFXMLRequestOperation` if you're using AFNetworking? – Aaron Brager Aug 21 '13 at 13:56
  • @AaronBrager..yes that's probably a better idea...till now,i didn't go for it...will try to use it in the future case... – Master Stroke Aug 22 '13 at 03:41