2013-08-21 3 views
-3

Je veux attendre la réponse du serveur et analyser le XML, puis appeler une autre fonction. Comment puis je faire ça? J'ai utilisé ce code pour envoyer une requête au serveur et utiliser NSXMLParser pour analyser la réponse XML.Comment attendre la réponse et analyser XML dans AFNetworking iOS

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

S'il vous plaît me donner toute suggestion. Merci beaucoup

+0

comment ur le faire maintenant? .. quelles sont les questions ur face? –

+0

Maintenant, je fais comme ci-dessus le code, mais parfois le serveur respose lentement si mon application plantage, je veux attendre jusqu'à ce que terminé, appelez d'autres fonctions. –

Répondre

1

Vous devez faire votre demande synchrone.

se réfèrent code quelque chose comme:

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]; 
+0

est-ce que c'est afnetworking? –

+0

AFNetworking est juste un package personnalisé. Vous pouvez faire ce que vous voulez avec le même ou personnaliser en conséquence.Il est le noyau un. – preetam

0

Vous pouvez le faire de manière synchrone ...

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 
    } 

OU

Vous pouvez achive en ajoutant [opération waitUntilFinished], après il est ajouté à l'opération queue.Refer cette ==>Can AFNetworking return data synchronously (inside a block)?

OU

EDIT: Si vous ne souhaitez pas utiliser la bibliothèque AFNetworking. Je préfère de cette façon.

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 
} 

Modifier selon votre GET/PUT methods.But je vous suggère d'aller pour la méthode POST, comme il est refered d'être comme une garantie.

+0

J'ai essayé mais cela ne fonctionne pas .... [opération setCompletionBlockWithSuccess:^(opération AFHTTPRequestOperation *, id responseObject) { NSURLResponse * réponse = nil; NSError * error = nil; NSData * data = [NSURLConnection sendSynchronousRequest: afRequest returnResponse: & erreur de réponse: & erreur]; NSString * parsexmlinput = [[NSString alloc] initWithData: encodage de responseObject: NSUTF8StringEncoding]; –

+0

ne pas utiliser les blocs ... –

+0

encore une fois édité la réponse .. vous pouvez choisir les moyens ... –

1

vérifiez ce tutoriel Ray Wenderlich en utilisant AFnetworking.

aide de tasseaux et 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]; 
} 
+0

si j'utilise NSXMLParse pour analyser xml cette réponse de serveur, comment faire cela? –

+0

vérifier le tutoriel, il vous indique comment utiliser le NSXmlParse, vous devez définir les délégués et toutes les méthodes. – HernandoZ