2008-10-15 7 views
15

J'ai deux NSURLConnections. Le second dépend du contenu du premier, donc la gestion des données reçues de la connexion sera différente pour les deux connexions.Plusieurs délégués NSURLConnection dans Objective-C

Je ne fais que reprendre Objective-C et j'aimerais savoir quelle est la bonne façon d'implémenter les délégués.

En ce moment je suis en utilisant:

NSURL *url=[NSURL URLWithString:feedURL]; 
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease]; 
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self]; 

Je ne veux pas utiliser l'auto comme délégué, comment puis-je définir deux connexions avec différents délégués?

NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1]; 
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2]; 

Comment créer des handle1 et handle2 en tant qu'implémentations? Ou des interfaces? Je ne comprends pas vraiment comment tu ferais ça.

Toute aide serait géniale.

Merci, Brian Gianforcaro

Répondre

4

Dans votre exemple, vous alloc un objet DownloadDelegate sans jamais s'être initialisé il.

 
    DownloadDelegate *dd = [DownloadDelegate alloc]; 

Ceci est dangereux. Au lieu de cela:

 
    DownloadDelegate *dd = [[DownloadDelegate alloc] init]; 

De plus, ce n'est pas strictement nécessaire de déclarer vos méthodes d'intervention des délégués dans votre déclaration de @interface (bien qu'il ne fera pas mal, bien sûr). Enfin, vous devez vous assurer que vous implémentez la connexion: didFailWithError: et connectionDidFinishLoading: pour libérer votre objet DownloadDelegate, sinon vous fuirez.

Content que vous soyez opérationnel!

3

délégués sont mis en œuvre sous forme d'objets standards NSObject-DESCENDU.

Vous pouvez pointer les deux connexions vers le même délégué.

Le délégué doit implémenter les méthodes NSURLConnectionDelegate que vous souhaitez intercepter (telles que -connection: didReceiveData: et -connectionDidFinishLoading :). Ces méthodes seront appelées par le délégué selon le cas.

14

Ben, alors que votre information a été utile Il n'a pas entièrement répondu à la question que j'ai posée. J'ai enfin compris comment installer mes propres délégués, ce que je demandais vraiment.

Je mis en œuvre comme si:

@interface DownloadDelegate : NSObject 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
@end 

@implementation DownloadDelegate 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
} 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
} 
@end 

Nous utilisons le délégué comme ceci:

DownloadDelegate *dd = [DownloadDelegate alloc]; 
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd]; 

espoir qui aide tout le monde dans la même position, et merci encore Ben pour votre aide.

Merci,

Brian Gianforcaro

+2

Grande réponse. Exactement ce que je cherchais. Merci d'avoir pris le temps de répondre à votre propre question – Pillblast

0

étant donné que les délégués sont appelés de manière asynchrone, ils peuvent appeler la commande didfinishloading dans un ordre aléatoire. Vous pouvez ensuite utiliser une vérification d'état pour déterminer si le téléchargement "autre" est déjà effectué avant de continuer.

i utiliser 2 délégués:

par exemple (ce qui est pseudo oc):

jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)] 
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)] 

lorsque chaque délégué se termine, le délégué informe l'appelant, en appelant les 2 méthodes TERMINÉ. Chaque méthode done reçoit les données de l'URL et enregistre son état dans un ivar. ensuite ils vérifient si l'autre ivar est positionné, et continuent le traitement si les deux sont terminés.

if(self.jsonString && self.otherData){ 
    continueProcessing 
} 

espérons que cela aide.

10

Je pense que la meilleure façon de gérer plusieurs connexions d'une manière propre est de garder un seul délégué et juste identifier chaque NSURLConnection avec une étiquette (c'est un sous-classement très très simple, vous pouvez lire et copier à partir http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/)

Fondamentalement à init chaque NSURLConnection avec une étiquette d'identification, puis vous pouvez tirer cette balise dans le délégué et en utilisant Switch-Case gérer selon la logique dont vous avez besoin.

MISE À JOUR

J'ai tourné la NSURLConnection dans un sous-classé simple Catégorie - un peu plus simple et plus propre

https://github.com/Shein/Categories