2009-11-24 7 views
2

Je développe une application qui parlera avec un service Web exposant plusieurs méthodes. J'essaie de déterminer quel serait le meilleur modèle pour centraliser l'accès au service Web, donner des options pour l'accès synchrone et asynchrone, et retourner les données aux clients. Est-ce que quelqu'un a déjà abordé ce problème? Une classe pour toutes les méthodes semble bien centraliser tout, mais je pense qu'il serait déroutant de renvoyer les données aux bons endroits, en particulier lorsqu'il s'agit de plusieurs appels asynchrones. Une autre pensée que j'avais était une sous-classe distincte pour chaque méthode, avec une sorte d'accès de courtage d'usine, mais je pense que cela pourrait être surengager la situation.Motif de conception pour iPhone -> fonctionnalité de service Web?

(note: ne demande pas quelle méthode appelle à utiliser/comment analyser la réponse/etc, à la recherche d'une solution de modèle de conception de haut niveau au problème général)

Répondre

1

Je suis récemment tombé sur le même problème. Bien que je ne crois pas que ma solution soit optimale, elle pourrait vous aider. J'ai créé un gestionnaire de service Web et un protocole de point de terminaison. Chaque objet qui implémente le protocole de point de terminaison est chargé de se connecter à un point de terminaison de service Web (méthode), d'analyser les données renvoyées et d'informer son délégué (généralement le gestionnaire de service Web) d'achèvement ou d'éventuelles erreurs. J'ai fini par créer une classe EndpointBase que j'utilise 99% du temps.

Le gestionnaire de service Web est responsable de l'instanciation des points de terminaison si nécessaire et de leur invocation. Tous les appels arrivent de manière asynchrone.

Dans l'ensemble, il semble fonctionner plutôt bien pour moi. Je me suis retrouvé dans une situation dans laquelle un point de terminaison s'est appuyé sur la réponse d'un autre (j'ai utilisé le modèle de commande là).

Composants SDK que vous aurez envie de regarder sont:

  • NSURLConnection
  • NSXMLParser
+0

Je me dirigeais vers ce type de solution, comme si je n'étais pas le seul à penser cela. La seule différence dans mon esprit est qu'au lieu d'utiliser des délégués, utilisez KVO, car je pourrais potentiellement avoir plusieurs consommateurs d'un point de terminaison simultanément. Cela me permettrait également d'injecter une sorte de logique de mise en cache plus tard, puisque tout ce que j'observe est le même objet de point de terminaison. mettra à jour plus tard avec la façon dont cela finit par descendre. –

+0

Le délégué doit principalement informer le gestionnaire de service Web que le point de terminaison est terminé. Si le point de terminaison échoue, le gestionnaire de service décide de ce qu'il doit faire. J'utilise KVO pour mettre à jour la plupart des vues qui utilisent les données. – jessecurry

1

usines? Nous n'avons pas besoin d'usines puantes. Je l'ai fait quelques fois, et je fais ce que vous dites: un objet qui fournit des méthodes pour tous les appels de service Web, encapsulant les détails de la communication avec le service, la gestion des problèmes de connexion, etc. Dans une application, il s'agissait d'un singleton, car il devait conserver l'état de la session; dans une autre application, c'était juste une collection de méthodes statiques.

Avec un certain formatage des données de réponse, c'est l'intégralité de sa responsabilité.

Il revient aux appelants de savoir si l'appel est synchrone ou asynchrone; la classe elle-même est écrite de manière synchrone, et un appelant l'utilise simplement dans un fil séparé si nécessaire. Les méthodes performSelector ... de Cocoa rendent cela facile.

1

Si REST est un bon ajustement pour vos interactions de données, alors je suggère la bibliothèque ObjectiveResource. Il est conçu pour fonctionner de manière transparente avec une application Ruby on Rails, mais il parle essentiellement JSON ou POX (XML simple) via HTTP en utilisant les conventions rails ActiveResource. C'est un ensemble de catégories sur NSObject et certains des types d'objets primitifs qui vous permettront de faire des appels comme [Dog findAllRemote] pour retourner une liste d'objets Dog, ou [myDog saveRemote] pour envoyer les modifications apportées à myDog renvoyer l'objet au serveur.

Questions connexes