0

Je veux juste response de URL utiliser headerFieldsRéponse ne reçoit que par requête asynchrone, mais non par requête synchrone

Si je reçois NSURLResponse en utilisant asynchronousRequest ou NSURLSession ou NSURLConnection méthodes de délégués, alors il est très bien.

Ce que j'ai essayé avec NSURLSession

__block NSDictionary *resultDictionary; 
    NSURLSession *session = [NSURLSession sharedSession]; 
    [[session dataTaskWithURL:[NSURL URLWithString:@"http://72.52.65.142:8083/auth"] 
      completionHandler:^(NSData *data, 
           NSURLResponse *response, 
           NSError *error) { 
       NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; 
       NSLog(@"%@",httpResponse); 
       if ([response respondsToSelector:@selector(allHeaderFields)]) { 
        resultDictionary = [httpResponse allHeaderFields]; 
        // Call completion with parameter 
        completionHandler(resultDictionary); 
       } 
      }] resume]; 

Mais si j'utilise demande synchrone alors la réponse est nil

C'est ce que j'ai essayé

NSString *string = @"http://72.52.65.142:8083/auth"; 
NSURL *url = [NSURL URLWithString:string]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url]; 
[request setHTTPMethod:@"HEAD"]; 
NSURLResponse *response; 
NSError *error; 

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

NSLog(@"%@",response); 

Ici response montrant que nil.

Y at-il un problème avec mon code or comment obtenir une réponse?

+0

Est-ce que 'error' est réglé/contient-il quelque chose? –

+0

erreur est réglée @AndreasOetjen – Himanth

+0

Question: Pourquoi utiliser la requête synchrone? 'NSURLConnection' est obsolète. – Larme

Répondre

0

Il semble que vous attendiez que le bloc s'exécute de manière synchrone et modifiez la variable __block avant le retour de l'appel NSURLSession. Les méthodes asynchrones ne fonctionnent pas de cette façon. Le bloc que vous passez peut potentiellement exécuter minutes plus tard, selon les conditions du réseau.

Bien qu'il soit possible de créer un wrapper synchrone pour NSURLSession qui peut remplacer sendSynchronousRequest: (en effet, je l'ai fait pour des raisons que je ne vais pas entrer dans), il est assez difficile en raison du modèle de thread. Donc, si votre code est exécuté sur un thread non principal, vous devriez probablement continuer à utiliser sendSynchronousRequest:. Si vous devez absolument déplacer ce code vers NSURLSession, vous devrez réécrire votre code pour qu'au lieu de renvoyer une valeur à l'appelant, l'appelant fournisse un bloc à exécuter lorsque les données sont prêtes (et continuez ce modèle dans la méthode qui a appelé cette méthode, et la méthode qui a appelé cette méthode, et ainsi de suite jusqu'à la ligne, jusqu'à ce que vous manquiez de code qui dépend de la valeur retournée).