Question

J'ai deux connexions NSURLC. La seconde dépend du contenu de la première, de sorte que le traitement des données reçues de la connexion sera différent pour les deux connexions.

Je ne fais que reprendre Objective-C et j'aimerais savoir quelle est la bonne façon de mettre en œuvre les délégués.

En ce moment, j'utilise:

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 moi-même comme délégué, comment définir deux connexions avec des délégués différents?

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

Comment créerais-je handle1 et handle2 en tant qu'implémentations? Ou des interfaces? Je ne comprends pas vraiment comment vous feriez cela.

Toute aide serait géniale.

Merci, Brian Gianforcaro

Était-ce utile?

La solution

Dans votre exemple, vous allouez un objet DownloadDelegate sans l’initialiser.

    DownloadDelegate *dd = [DownloadDelegate alloc];

C'est dangereux. Au lieu de cela:

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

De plus, il n'est pas strictement nécessaire de déclarer les méthodes de réponse de votre délégué dans votre déclaration @interface (bien que cela ne fasse 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.

Je suis content que vous soyez opérationnel!

Autres conseils

Ben , vos informations nous ont été utiles. Elles n'ont pas 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 l'ai implémenté comme suit:

@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 suit:

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

J'espère que cela aidera tout le monde dans la même situation et merci encore à Ben de votre aide.

Merci,

Brian Gianforcaro

Je pense que la meilleure façon de gérer plusieurs connexions de façon propre consiste à conserver un seul délégué et à identifier chaque connexion NSURLConnection à l'aide d'une balise (il s'agit d'un très simple sous-classement que vous pouvez lire et copier à partir de http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/ )

En principe, chaque NSURLConnection doit être initialisée avec une balise d'identification, puis vous pouvez extraire cette balise dans le délégué et utiliser Switch-Case pour la gérer selon la logique dont vous avez besoin.

MISE À JOUR

J'ai transformé le sous-groupe NSURLConnection en une catégorie simple - un peu plus simple et plus propre

https://github.com/Shein/Categories

Les délégués

sont implémentés en tant qu’objets standard NSObject-descendus.

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 capturer (telles que -connection: didReceiveData: et -connectionDidFinishLoading :). Ces méthodes seront appelées par le délégué, le cas échéant.

Essayez mon cours MultipleDownload sur http://github.com/leonho/iphone- libs / tree / master , qui gère plusieurs objets NSURLConnection pour vous.

étant donné que les délégués sont appelés de manière asynchrone, ils peuvent appeler didfinishloading dans un ordre aléatoire. vous pouvez ensuite utiliser un contrôle d’état pour déterminer si l’autre "autre" le téléchargement est terminé avant de continuer.

J'utilise 2 délégués:

par exemple (c'est le pseudo oc):

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

à la fin de chaque délégué, le délégué informe l'appelant en appelant les deux méthodes done.

chaque méthode done reçoit les données de l'URL et enregistre son état dans un ivar. ils vérifient ensuite si l'autre ivar est défini et poursuivent le traitement s'ils ont tous les deux terminé.

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

espérons que cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top