J'ai plusieurs vues qui font la même NSURLRequest/NSURLConnection request
. Idéalement, pour obtenir une réutilisation de code, j'aimerais disposer d'une sorte de "proxy" qui effectue tout le travail sous-jacent de création/exécution de la requête/connexion (asynchrone), de la configuration de toutes les méthodes déléguées, etc. , donc je ne dois pas copier tous ces gestionnaires de méthode de délégué NSURLConnection
dans chaque vue. Tout d'abord, cette approche de conception est-elle raisonnable? Deuxièmement, comment pourrais-je faire quelque chose comme ça? Pour une petite information d'arrière-plan, j'ai essayé ceci et je l'ai mis au «travail», cependant, il ne semble pas exécuter de façon asynchrone. J'ai créé un fichier Proxy.h/m qui a des méthodes d'instance pour les différents appels de service Web (et contient également les méthodes de délégué NSURLConnection
):NSURLConnection Proxy NSURLRequest pour les appels de service Web asynchrones
@interface Proxy : NSObject {
NSMutableData *responseData;
id<WSResponseProtocol> delegate;
}
- (void)searchForSomethingAsync:(NSString *)searchString delegate:(id<WSResponseProtocol>)delegateObj;
@property (nonatomic, retain) NSMutableData *responseData;
@property (assign) id<WSResponseProtocol> delegate;
@end
Le WSResponseProtocol est défini comme tel:
@protocol WSResponseProtocol <NSObject>
@optional
- (void)responseData:(NSData *)data;
- (void)didFailWithError:(NSError *)error;
@end
Pour l'utiliser, le contrôleur de vue doit simplement se conformer au protocole WSResponseProtocol
, pour intercepter les réponses. Faire l'appel de service Web est fait comme si:
Proxy *p = [[Proxy alloc] init];
[p searchForSomethingAsync:searchText delegate:self];
[p release];
je peux fournir plus de code, mais le reste peut supposer. Avant d'appeler, je "commence à animer" un spinner UIActivityIndicatorView
. Mais le fileur ne tourne jamais. Si je place simplement les méthodes de délégué NSURLConnection directement dans le contrôleur de vue, alors le spinner tourne. Donc, cela me fait penser que mon implémentation ne s'exécute pas de manière asynchrone. Des pensées/idées ici?
Ah - très bien! Je vois ce que vous dites - votre solution éliminerait le besoin d'un protocole. Beaucoup plus simple! Merci pour ça! Je pense, cependant, que je commence à m'échauffer à la solution suggérée par Kendal, c'est-à-dire avoir des NSURLConnections synchrones enveloppées dans une NSOperation et jetées dans une file d'attente. Cette solution peut être une solution plus simple au problème de la création d'un cadre d'appels de service Web asynchrones, bien que mon approche + votre analyse soit toujours viable. – tbehunin
Rétablissement de mon commentaire plus tôt. Cette approche est l'approche que je vais utiliser avec NSURLConnections synchrones dans une NSOperation. NSURLConnection fournit déjà le thread dont j'ai besoin sans le mettre dans une NSOperation. De plus, après avoir lu plus de blogs, l'authentification NSURLConnections + synchrone ne fournit pas autant de "hooks" que les appels asynchrones. – tbehunin
Où \ comment receiveDataData est-il déclaré? La documentation ne cesse de dire qu'elle est déclarée ailleurs mais ne donne aucune information sur la façon de le faire. –