Comment faire en sorte que le programme attende que NSURLConnection asynchrone soit terminé avant de passer à la commande suivante?
Comment puis-je faire mon programme attendez asynchrone NSURLConnection à terminer avant de passer à la ligne suivante de code?
SetDelegate *sjd= [SetDelegate alloc];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:post delegate:sjd];
[connection start];
C'est comment j'ai lancer la connexion et que je traite les données reçues dans le délégué, mais je veux attendre la fin à la connexion avant de procéder principalement parce que c'est dans une boucle for et il a à exécuter pour chaque élément dans ma base de données.
J'ai besoin de mettre des données à partir de téléphones de base de données à une base de données distante et après la collecte de données a été introduit dans les données du téléphones base de données est supprimée. Je suis passer par chaque élément dans le téléphone de la base de données et démarrer une connexion c'est pourquoi je ne vois pas en quoi le prochain truc qui peut être fait à partir de la boucle. Je suis un novice quand il s'agit de l'objectif-la programmation en c donc je ne sais pas si c'est la bonne façon ou de ne pas le faire
De faire l'appel synchrone n'est pas une option, car il bloque le programme et j'ai une barre de progression qui s'affiche.
source d'informationauteur Pillblast
Vous devez vous connecter pour publier un commentaire.
Votre question est un peu bizarre. Vous avez incroyablement limité de la question. Vous ne pouvez pas avoir une ligne de code "attendre" un processus de finir w/o blocage quelque chose, dans ce cas, quelle que soit enfilez la boucle est en cours d'exécution.
Vous pouvez utiliser un appel synchrone si l'on veut, il ne bloque pas votre application, il ne fait que bloquer le fil, elle est exécutée. Dans votre exemple, vous avez une boucle qui est sans cesse en train de données à distance et que vous voulez que votre INTERFACE utilisateur pour refléter le fait que jusqu'à ce qu'il se fait. Mais vous ne voulez pas que votre INTERFACE utilisateur bloqué. Cela signifie que, ce fil avec votre boucle DOIT déjà être sur un thread d'arrière-plan de sorte que vous pouvez n'hésitez pas à faire un appel synchrone dans la boucle w/o le blocage de votre thread de l'INTERFACE utilisateur. Si la boucle est sur le thread de l'INTERFACE utilisateur vous avez besoin de changer cela pour faire ce que vous voulez.
Vous pourriez aussi le faire à l'aide d'une connexion asynchrone. Dans ce cas, l'opération peut réelle plus rapide b/c vous pouvez avoir plusieurs demandes en même temps. Si vous le faites de cette façon, la boucle peut rester sur le thread de l'INTERFACE utilisateur et vous avez juste besoin de suivre toutes les connexions de sorte que quand ils sont finis, vous pouvez communiquer cet état pour les contrôleurs concernés. Vous aurez besoin d'iVars pour suivre l'état de chargement et d'utiliser un protocole ou NSNotification de communiquer lorsque le chargement est terminé.
EDIT: AJOUT DE L'EXEMPLE DE L'APPEL SYNCHRONE SUR LE THREAD D'ARRIÈRE-PLAN
Si vous voulez la boucle pour terminer complètement que lorsque toutes les demandes sont finis et de ne pas bloquer votre thread de l'INTERFACE utilisateur, voici un exemple simple:
Objets quelconques besoin de montrer l'état de chargement doit observer et de manipuler les notifications que vous postez ici. La boucle sera le taux de désabonnement à travers et de faire toutes vos demandes de manière synchrone sur un thread d'arrière-plan et votre thread de l'INTERFACE utilisateur sera débloqué et réactive. Ce n'est pas la seule façon de le faire, et en fait, je voudrais le faire en utilisant les connexions asynchrones moi-même, mais c'est un exemple simple de la façon d'obtenir ce que vous voulez.
Si vous voulez simplement savoir quand il est complet et n'a pas vraiment à s'inquiéter, il suffit d'utiliser la
NSNotificationCenter
de publier une notification et avoir votre point de vue abonner.Délégué - Poste de la Notification à l'achèvement
Vue - Ajouter d'observateur et d'exécuter du code lorsqu'on les observe
Maintenant, si vous avez besoin de passer un simple objet en tant que données, vous pouvez essayez de télécharger le paramètre d'objet dans votre notification comme ceci:
Puis changer votre point de vue et de nettoyage de la signature comme ceci:
Maintenant, je me suis retrouvé à avoir besoin de quelque chose un peu plus que cela, j'ai donc fini par créer un singleton pour gérer l'ensemble de mes demandes. Depuis tous de votre délégué méthodes de
NSURLConnectionDelegate
vous donner de l'instance et de laNSURLConnection
pour la connexion spécifique, vous pouvez facilement stocker une mutable objet de données dans un dictionnaire et chercher à chaque fois par la connexion. À partir de là, j'ai une signature de méthode qui prend et l'objet et le sélecteur dans que j'associe avec la connexion donc après tout est terminé, je peux passer que mutable objet de données pour le demandeur en effectuant le sélecteur sur cet objet.Je ne comprend pas tout de ce code ici, mais peut-être que vous aidera à réfléchir sur ce qui est possible. J'ai trouvé que j'avais beaucoup de code lié jusqu'en faisant des appels de service web afin d'emballage tout dans un singleton m'a donné une belle propre façon de récupérer des données. Espérons que cette aide!
Si vous voulez vraiment la peine d'attendre, pourquoi utiliser un appel asynchrone à tous? Utiliser un appel synchrone à la place:
Cette approche permettra de bloquer le thread exécuté, de sorte que vous devez être sûr que vous voulez faire! Ai-je mentionné qu'il va bloquer? 🙂
Vous dites que vous voulez attendre un asynchrone appel à la fin, donc je suis en supposant que vous appelez le code que vous avez posté dans un thread séparé.
Je recommande d'avoir un coup d'oeil à la nouvelle
sendAsynchronourRequest
méthode. J'ai posté un exemple de la façon dont vous pouvez l'envelopper dans une classe qui permettrait d'informer son délégué lors de la connexion a terminé /timed out /échoué. Je suis seulement en vous référant à ce poste, car il semble que vous essayez d'atteindre quelque chose de très similaire à ce que j'avais à l'époque, et ceDownloadWrapper
classe a fonctionné parfaitement pour moi. Il y a de nouveau dans iOS5, vous l'esprit.Cette golden nugget m'a aidé!
J'ai été en utilisant synchrone NSURL juste bien jusqu'à ce que j'ai décidé que j'avais besoin de SSL pour ma connexion entre mon client et mon serveur. J'ai pris l'approche de key pinning qui est de comparer les cert sur l'appareil pour le cert sur le serveur (lire la suite sur le lien ci-dessus) et dans l'ordre pour qu'il fonctionne, j'ai besoin d'ajouter du code à la NSURL méthodes qui, à partir de mes recherches, vous ne pouvez pas faire avec NSURL synchrone.
Jusqu'à ce que j'ai trouvé cette ridiculement simple solution qui a fonctionné pour moi:
NSURLConnection est déjà asynchrone. Simplement de mettre en œuvre le délégué des méthodes. Si vous voulez mettre à jour l'INTERFACE utilisateur sur le MainThread (par exemple, une barre de progression), vous pouvez le faire en
didReceiveData.
ou regarder cette