2010-12-28 2 views
0

Je suis en train d'écrire une application iPhone qui appellera une méthode webservice en utilisant un format de message de savon. J'ai besoin d'un processus synchrone car la vue table a besoin de ces données avant de pouvoir être affichée. Donc, j'utilise [NSURLConnection sendSynchronousRequest: returnResponse: erreur:]NSURLConnection problème synchrone

Le problème est que tout le programme va quitter sans aucun message d'erreur après l'appel de la méthode. Même si je mets une instruction NSLog juste après le [NSURLConnection sendSynchronousRequest: returnResponse: erreur:], il n'y a aucune sortie donc je suis sûr que le programme quitte pendant cet appel de méthode. En fait, pendant cette requête HTTP et la substance de réponse.

Cependant, si je mets un point d'arrêt avant l'appel de cette méthode, et exécute le programme en mode débogage, tout fonctionne bien, le programme ne se terminera pas, et j'ai aussi mes résultats.

Quelqu'un peut-il comprendre ce qui se passe? Merci.

- (void) sendSyncHTTPRequest:(NSString *)request_data operation:(ServOperationSync *)serv_ops { 
id<ServiceData> serv_data = serv_ops.dataDelegate; 
NSURL *urlAddr = [NSURL URLWithString:[serv_data getServURL]]; 

urlRequest = [NSMutableURLRequest requestWithURL:urlAddr 
            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
           timeoutInterval:90]; 
NSData *requestData = [request_data dataUsingEncoding:NSUTF8StringEncoding]; 
[urlRequest setValue:@"MobilePortal" forHTTPHeaderField:@"User-Agent"]; 
[urlRequest setValue:[serv_data getSoapAction] forHTTPHeaderField:@"SOAPAction"]; 
[urlRequest setValue:[NSString stringWithFormat:@"%u", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[urlRequest setValue:urlAddr.host forHTTPHeaderField:@"Host"]; 
[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setHTTPBody:requestData]; 

NSLog(@"just before sending http request"); 
[serv_ops.responseData setData:[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&urlError]]; 
NSLog(@"after sending http request"); 

}

Notez que urlResponse et urlError sont déclarés comme variables d'instance.

+0

J'ai plus d'informations à ce sujet. Quand je cours le programme, et j'appuie sur le "Pause" de la barre d'outils de console, et reprends le programme, tout est bon, j'obtiens le résultat. Si je lance le programme, ne rien faire et le laisser tourner, le programme quitte sans aucun message. Il semble donc que le programme ne peut pas fonctionner dans son propre processus ou thread, boucle d'exécution ou quoi. Je ne suis pas sûr, parce que je pense que peu importe si je cours le programme en mode débogage ou pause alors il reprend, en fait je joins le processus de programme à autre ou quoi, comme accroché par GDB? Toute information sera appréciée. – user556623

+0

Etes-vous sûr que NSURLConnection est la raison de votre crash ?! –

Répondre

0

Vous devez:

  • une boucle d'exécution sur votre code
  • et n'oubliez pas vos NSURLConnection délégués
+0

Salut, Neilvert, merci pour votre réponse. Êtes-vous en train de dire que j'ai besoin d'utiliser asynchrone car synchrone ne fournit pas de paramètre délégué.Je me demande juste comment utiliser asynchrone pour réaliser ce que je veux, c'est d'empêcher la vue de table vide d'apparaître. Je pense que j'ai encore besoin de bloquer le fil d'une certaine façon, et n'est-ce pas ce que fait synchrone? – user556623

3

Vous ne nous avez pas fournir assez de code pour savoir pourquoi votre l'application ne se comporte pas correctement.

L'utilisation de [NSURLConnection sendSynchronousRequest:returningResponse:error:] est généralement une mauvaise idée, car elle bloque le thread en cours. Vous l'appelez probablement depuis le thread principal, cela bloquera l'interface utilisateur. L'application ne répond pas aux touches et se sent comme gelé, lorsque la demande prend longtemps (en particulier sur une connexion à faible bande passante comme EDGE).

La nature de la mise en réseau est asynchrone. Je vous conseille donc de faire une demande asynchrone à la place ou d'utiliser GCD. Mettez à jour le Tableview dans les méthodes de délégué (connexion: didReceiveData: etc.). Vous pouvez sauvegarder les données de vue de table dans un NSMutableArray et appeler [tableView reloadData] après avoir modifié le tableau. La tableview sera alors construite à partir de ce tableau dans les méthodes déléguées UITableViewDataSource.

+0

Je suis sûr que [NSURLConnection sendSynchronousRequest: returnResponse: error:] cause le problème. C'est parce que je mets un NSLog juste avant et juste après, l'ancien peut être affiché et le dernier n'affichera pas le message. En fait, j'ai besoin d'utiliser ce synchrone parce que c'est quand l'application est au démarrage, je l'appelle dans la méthode applicationDidFinishLaunching, j'ai besoin de ces données pour remplir la première vue de mon application qui est une vue de table. Si j'utilise le mode asynchrone, la fenêtre apparaîtra tout de suite et la vue de navigation vide et la vue de table seront affichées ce qui n'est pas bon. – user556623