2010-12-12 30 views
1

J'ai donc lu sur les avantages et les inconvénients de l'utilisation de Singleton, et j'ai un scénario que je ne suis pas sûr si je devrais en utiliser un, et Je pensais vous consulter les gars.Dois-je utiliser singleton - Http Connexion au serveur - Conception Iphone App

J'écris une application Iphone qui, de temps en temps, doit communiquer au serveur (HTTP) des informations sur l'utilisateur connecté. Ce service web est appelé depuis différentes parties de mon application.

Ce que je réellement besoin sont deux types de classes:

  1. Responsable de la communication avec le serveur - responsable de la mise en http, l'URL, en-tête, etc. paramètres et

2.classes pour chaque type d'API de service Web - pour la classe UpdateUserInfo exmpale ou la classe SendResults. Ce c

La 2ème classe utiliserait le 1er, et tout au long de l'application, j'aurais besoin de beaucoup d'appels aux 2e classes.

Dois-je utiliser Singleton pour l'une de ces thèses? Quelle est la meilleure façon de le concevoir?

Merci les gars!

Modifier:

Exemple pour la 1ère classe (Appelons DataDownloader) méthode serait:

(NSData *) downloadDataWithRequest:(NSURLRequest *) 
{ 
    ASIHTTPRequest *dlRequest = [[ASIHTTPRequest alloc] initWithURL:[request URL]]; 
    [dlRequest setTimeOutSeconds:20];  

    if(retryNum < 1) 
     retryNum = 1; 
    [dlRequest setNumberOfTimesToRetryOnTimeout:retryNum]; 

     // and more of the same 
} 

ASIHTTPRequest est quelque chose que nous utilisons comme une enveloppe HTTP.

Maintenant, je ne voudrais pas appeler cette séquence de fonction chaque fois que je veux envoyer une requête HTTP au serveur, donc l'option serait de mettre cela dans une classe dédiée et de créer une nouvelle instance, ou en utilisant un singletion .

Ce que je peux faire est par exemple utilisant quelque chose comme ça:

[[UpdateUserInfo sharedInstance] updateInfo:info] 

Ce qui peut être mis en œuvre par la mise en place d'un NSURLRequest en utilisant les informations param et appeler

[[DataDownloader sharedInstance] downloadDataWithRequest:InfoUrlRequest] 

Maintenant, en supposant que la Les requêtes http sont asynchrones, je peux toujours générer plusieurs en même temps.

J'espère que c'est plus clair maintenant. Selon vous, quelle est la meilleure façon de le concevoir?

Répondre

1

Je ne verrais pas le motif singleton comme étant une solution utile au problème que vous essayez de résoudre. C'est vraiment conçu comme une technique pour contrôler l'accès à une ressource unique/finie, ce qui n'est pas vraiment le cas de ce que je peux dire.

Par exemple, existe-t-il une raison quelconque pour laquelle vous ne permettriez pas à un utilisateur d'effectuer deux activités liées au réseau en même temps? Par ailleurs, par intérêt, avez-vous regardé des classes de cacao comme NSURLConnection? Je ne suis pas sûr que vous auriez besoin d'une classe de niveau inférieur pour gérer les communications du serveur comme vous l'envisagez - cette classe pourrait suffire.(Avait à dire sans en savoir plus sur ce que vous essayez d'atteindre.)

+0

Voir ma modification. merci – Idan

0

Je habituellement (et qui est de préférence personnelle) ont un singleton qui contrôle la gestion du réseau (un motif de singleton et la façade en un seul) à ne pas avoir plus que les 5 connexions autorisées . Cela pourrait aussi être possible pour vous. Ce serait un singleton pour une partie de votre tâche 1.
Mais comme BobC l'a déjà souligné, ASIHTTPRequest devrait faire tout ce dont vous avez besoin.
Ne pas réinventer la roue!

+0

Voir ma modification. Merci – Idan

0

J'utilise le modèle singleton pour contrôler l'accès à une API Web qui utilise ASIHTTPRequest, et cela fonctionne très bien. ASI utilise NSOperationQueues pour les requêtes asynchrones, vous n'avez donc pas besoin de vous inquiéter des demandes se chevauchant. Comme je ne connais pas l'ordre dans lequel les demandes sont renvoyées, j'autorise parfois mes méthodes API publiques à fournir des dictionnaires userInfo afin que mes rappels aient un certain contexte lorsqu'ils se déclenchent.

0

J'utiliserais le modèle Service Locator pour obtenir chacun des services requis dans votre application. Il existe plusieurs façons de créer le localisateur de service. Je préfère la configuration à l'initialisation sur la configuration pendant l'exécution.

http://en.wikipedia.org/wiki/Service_locator_pattern