2009-09-20 8 views
3

Je ne sais même pas si le titre est correct, mais j'essaie d'utiliser la classe standard NSURLConnection pour gérer les réponses à l'appel de mon webservice. J'utilise la méthode POST pour mettre à jour une base de données et la méthode GET pour récupérer des lignes de la base de données. Le problème que j'ai est que ces 2 actions peuvent se produire simultanément afin que les méthodes pour gérer la demande puissent se chevaucher. En d'autres termes, dans ma méthode "connection didReceiveData", j'ai 2 chemins à travers le code selon que je gère une réponse à partir d'une requête GET ou POST.iphone RESTful webservices

Je garde la trace de la requête traitée par une variable d'instance appelée requestType. Le problème est que, puisque les requêtes sont exécutées simultanément, la variable d'instance est en train de passer de GET à POST avant la fin du GET (ou vice-versa). Ma question est comment puis-je maintenir 2 demandes distinctes dans ce scénario? Est-ce que je synchronise les demandes? Y a-t-il un moyen pour que les threads fonctionnent ici? Est-ce que je crée 2 objets séparés pour chacune des requêtes et ai la logique dans la requête "didRecieveData" pour quel objet est traité? Toute aide serait très appréciée!!

Répondre

1

Résolvez un problème similaire dans l'une de nos applications. La solution consistait à créer une classe représentant un appel de service web, chargée d'appeler sa propre URL, de charger ses propres données, etc. La classe d'appel avait un délégué qui gérerait l'analyse des réponses (dans notre cas, un contrôleur de service Web). Enroulé devient plutôt compliqué, mais empêché le problème de NSURLConnections se marchant les uns sur les autres.

1

On dirait que vous avez créé un problème compliqué en ayant une classe qui essaie de faire trop de choses. Je suggère de prendre l'une des trois approches suivantes:

1) Écrivez deux classes, une pour les mises à jour et une pour les récupérations. Chaque classe crée son propre objet NSURLConnection privé et agit en tant que délégué pour les notifications asynchrones reçues de NSURLConnection. Les classes pourraient partager un code d'analyse d'utilitaire ou étendre un objet de base contenant ce code d'analyse. Mais la clé étant que le code appelant ces classes instancie l'un d'entre eux, passe l'appel, puis le relâche. Cela gardera votre code plus propre et assurera que les notifications d'événements ne soient pas mélangées.

2) Créer une seule classe qui, selon l'initialisation, fait un post ou un get avec son propre instance privée de NSURLConnection. Lorsqu'un appel doit être effectué, instancier la classe, obtenir les résultats, puis libérer la classe.

3) Écrivez vos classes de gestion de connexion pour qu'elles utilisent la méthode synchrone NSURLConnection et appellent cette classe dans un thread d'arrière-plan. Dans tous les cas, le nettoyage du code et l'orientation claire de l'objet éviteront les scénarios désordonnés comme celui que vous décrivez.

0

Créez des objets séparés qui gèrent les appels. Si vous voulez lancer plusieurs requêtes à la fois, je vous recommande vivement de regarder NSOperationQueue, et de faire en sorte que ces sous-classes d'objets de NSOperation ... soient bien plus efficaces pour traiter plusieurs requêtes d'arrière-plan.

Un bon exemple est ici:

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

L'idée il y a que vous utilisez les appels Web non asyncronous, dans les opérations qui sont exécutées sur des threads séparés. Vous pouvez toujours utiliser des appels asynchrones dans NSOperation, mais cela est un peu plus compliqué et pour les appels simples, vous n'avez probablement pas besoin de le faire.