2010-01-20 6 views
4

J'ai une application iPhone qui utilise ASIHTTPRequest pour communiquer avec un service REST sur mon serveur. Quand je cours sur le simulateur, ça marche très bien, mais quand je suis sur le téléphone, j'ai un comportement bizarre.ASIHTTPRequest synchrone

La toute première fois que je clique sur le bouton qui initie la requête, j'obtiens les résultats immédiatement, et tout va bien. À partir de ce moment, lorsque je clique sur le bouton pour lancer la connexion, il faut environ 2-3 minutes pour se connecter. Il semble presque que l'ASIHTTPRequest que j'ai lancé en premier (et dont j'ai déjà reçu les bons résultats) n'est pas terminé. Y a-t-il une sorte de magie que je dois utiliser pour terminer la demande d'origine avant de commencer la suivante? J'ai supposé que puisque la méthode -start est revenue, et j'ai des résultats du serveur que la demande originale a été accomplie et je pourrais commencer un autre.

Des idées?

Merci

--Steve

Répondre

2

Vous croyez pas appeler la méthode -start, il appartient à la NSOperation. L'interface ASIHTTPRequest est soit -startSynchronous soit -startAsynchronous.

Toutefois, il est fortement recommandé d'utiliser l'appel asynchrone sinon, votre thread principal (c'est-à-dire, l'interface utilisateur) sera bloqué.

De la documentation ASIHTTPRequest [1]

En général, vous devez utiliser requêtes asynchrones de préférence à requêtes synchrones. Lorsque vous utilisez ASIHTTPRequest de manière synchrone à partir du thread principal , l'interface utilisateur de votre application se verrouille et devient inutilisable pendant la durée de la demande . les requêtes synchrones ne sont vraiment adapté pour le logiciel sans une interface utilisateur (comme un script qui va de la borne ), ou si vous exécutez la demande d'un thread séparé qui vous maintenez (peut-être à l'intérieur de votre propre NSOperation, par exemple).

[1] http://allseeing-i.com/ASIHTTPRequest/How-to-use

+0

La version de ASIHTTPRequest que j'avais téléchargée en décembre n'avait pas la méthode startSynchronous, seulement la méthode -start. J'ai téléchargé la version la plus récente de ASIHTTPRequest, et changé le code pour utiliser startSynchronous, mais l'effet est le même. – Steve

+0

Passer à startAsynchronous n'a pas aidé. Le premier appel passe, tous les appels suivants échouent avec un "échec de connexion A". L'erreur sous-jacente est un délai d'expiration. – Steve

+0

J'ai changé le code de sorte que chaque ASIHTTPRequest s'exécute dans une file d'attente séparée. Maintenant, cela fonctionne environ 50% du temps, le reste du temps, il expire. Cela devient frustrant. Est-ce que je devrais abandonner sur ASIHTTPRequest pour le téléphone et revenir à NSURLConnection pour que cela fonctionne? – Steve

6

Steve - Ce que vous avez décrit est un problème commun qui se produira si les demandes tentent de maintenir une connexion persistante. Essayez ceci:

[request setShouldAttemptPersistentConnection:NO];