2009-12-07 3 views
0

Im en utilisant une grande quantité de très petits services Web dans mon application et j'ai été un couple de routes qui n'échelle ou de travail comme vous le souhaitez.Délégation dans un dessin NSThread? (IPhone)

L'approche de conception Im penser à: La tâche du viewController est de demander un ensemble de données d'un webServicesClass général, cette tâche est lancée dans une nouvelle NSThread -> ce instancier un objet qui récupère uniquement le xml et le renvoie à webServicesClass -> webServicesClass instancie maintenant un objet qui peut uniquement analyser du code XML provenant de ce service Web particulier. L'analyseur renvoie ensuite un bel objet Entity à la classe webServiceClass. WebserviceClass doit maintenant informer le viewController de ces données.

Le viewController met en œuvre une webServiceClassDelegate et certaines méthodes de délégué pour voir si la demande de service Web est passé comme prévu. par exemple. - (void) aWebserviceFailed et - (void) aWebserviceSuccess.

0.5 Étant donné que WebServiceClass est en cours d'exécution est un NSThread différent, cela pose-t-il un problème lors de l'appel de méthodes déléguées sur le NSThread principal de l'objet parent?

1.0 Je pense que cette conception est solide car elle encapsule complètement la récupération, l'analyse et le retour de l'entité dans différentes classes. Mais, je devrai écrire des méthodes de délégation et implémenter des protocoles de délégation à chaque étape du chemin, pour chaque webservice différent. ie à partir du bas, WebserviceClass doit implémenter des méthodes de délégation pour l'objet qui récupère le XML (start, fail, success), puis pour l'objet qui analyse le XML (start, fail, success) et le WebserviceClass doit pouvoir déléguez chacune de ces réponses à viewController qui doit de nouveau implémenter des méthodes de délégation à partir de WebserviceClass (start, fail, success). Existe-t-il une façon beaucoup plus simple de faire cela? J'ai une certaine expérience de modèle de conception, mais pas de langues qui utilisent la délégation de manière aussi cohérente que l'objectif C. Dans AS3 ou Java, j'aurais des événements qui pourraient surgir à travers les objets et informer celui qui était à l'écoute des changements. Dans tout l'exemple de code Objective que j'ai lu, je n'ai vu que NSNotifications (qui serait l'équivalent de l'AS3 ou Java 'Event') utilisé 0,1% des fois.

Le Design Je décrit me donner quelque chose qui s'adapte parfaitement pour de nombreux services web et me donne un contrôle complet sur lequel une erreur potentielle/exception se produit, mais il semble être beaucoup de code pour obtenir ce couplage lâche.

1,1 Ou dois-je adopter pleinement l'approche de la délégation et se rendre au travail :)

Merci pour tous les pointeurs ou l'aide fournie. Je ne demande pas de code source ou les goûts, plus un "ceci est considéré comme la meilleure pratique dans l'objectif C dans la situation quotidienne que vous venez de décrire" :)

Répondre

1

Je recommande de jeter un oeil à ASIHttpRequest (disponible here) NSOperation + NSOperationQueue (documents here). Je ne pense pas que vous devriez lancer un fil à vie longue pour parler à votre service Web tout le temps, sauf si vous avez absolument besoin d'une connexion constante.

Fondamentalement, ASIHttpRequest et NSOperation encapsulent tous les éléments de mise en réseau et de thread. Les opérations rendent le multi-threading sur l'iPhone vraiment sympa. Essentiellement, vous créez une opération (à travers une usine ou autre chose pour la facilité d'utilisation), le mettre dans une file d'attente et faire quelque chose avec le résultat.

Quant à ce que vous faites avec le résultat (cela vaut pour votre scénario d'origine et aussi 0,5 et 1,1) ce qui se passe généralement est votre opération/fil sera alors appeler une méthode didSucceedAtGettingWhatever ou didFailWithError:(NSError*). La délégation est à peu près la façon factuelle de faire des demandes au téléphone. S'il y a plusieurs délégués, alors vous pouvez simplement utiliser le sujet-observateur, comme vous le feriez en Java.

Comme pour 1,0, en fin de compte pas. Ce que nous faisons généralement, c'est que nous avons un OperationDelegate et un OperationTypes. En fonction du type d'opération réussi ou achevé, nous avons une logique différente. Ce n'est pas le meilleur et il y a une tonne de façons différentes de le faire, mais vous devrez avoir une logique distincte pour des événements distincts, indépendamment de ce que vous faites. Que ce soit ou non dans une méthode ou plusieurs méthodes est à vous.

+0

Merci beaucoup Malaxeur! Il est toujours sain d'écrire une question comme la mienne et comme je le faisais, j'ai eu quelques idées, j'ai failli ne pas cliquer sur "Publier". Maintenant je suis content de l'avoir fait. En lisant la documentation ASIHTTPRequest, j'ai également pensé à la bibliothèque fournissant à la fois une méthode de requête synchrone et asynchrone. L'utilisation de la délégation n'est pertinente que pour le code asynchrone. Si j'ai déjà déversé le tout dans un NSThread séparé, il n'est pas nécessaire de diviser toutes les sous-routines en threads. Donc mes getData et ParseData devraient juste retourner mes valeurs directement. – RickiG

+0

Si quelque chose ne va pas, je m'en fous si cela se produit de manière asynchrone, j'ai juste besoin d'informer 'vers le haut' que ça a mal tourné. WebserviceClass aura un peu de logique, mais dans une conception de type Factory où il prendra simplement en compte tous les résultats possibles et retournera un objet qui correspond à ce scénario. Je me sens beaucoup mieux maintenant, merci :) – RickiG