J'ai une tonne de code répétitif dans ma classe qui ressemble à ceci:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
Le problème avec les demandes asynchrones est que lorsque vous avez diverses demandes en cours et qu'un délégué est assigné pour les traiter toutes comme une seule entité, beaucoup de branches et de code laid commencent à se formuler:
Quel genre de données récupérons-nous? S'il contient ceci, faites cela, sinon faites autre. Il serait utile, je pense, de pouvoir baliser ces demandes asynchrones, un peu comme si vous pouviez baliser des vues avec des identifiants.
J'étais curieux de savoir quelle stratégie est la plus efficace pour gérer une classe qui gère plusieurs requêtes asynchrones.
la source
[NSMapTable weakToStrongObjectsMapTable]
au lieu d'unCFMutableDictionaryRef
et économiser les tracas. A bien fonctionné pour moi.J'ai un projet où j'ai deux NSURLConnections distinctes, et je voulais utiliser le même délégué. Ce que j'ai fait, c'est créer deux propriétés dans ma classe, une pour chaque connexion. Ensuite, dans la méthode déléguée, je vérifie si de quelle connexion il s'agit
Cela me permet également d'annuler une connexion spécifique par nom en cas de besoin.
la source
Le sous-classement de NSURLConnection pour contenir les données est propre, moins de code que certaines des autres réponses, est plus flexible et nécessite moins de réflexion sur la gestion des références.
Utilisez-le comme vous le feriez pour NSURLConnection et accumulez les données dans sa propriété data:
C'est tout.
Si vous souhaitez aller plus loin, vous pouvez ajouter un bloc pour servir de rappel avec juste quelques lignes de code supplémentaires:
Réglez-le comme ceci:
et invoquez-le lorsque le chargement est terminé comme ceci:
Vous pouvez étendre le bloc pour accepter les paramètres ou simplement passer le DataURLConnection comme argument à la méthode qui en a besoin dans le bloc no-args comme indiqué
la source
CE N'EST PAS UNE NOUVELLE RÉPONSE. VEUILLEZ ME MONTRER COMMENT J'AI FAIT
Pour distinguer différents NSURLConnection dans les méthodes déléguées de la même classe, j'utilise NSMutableDictionary, pour définir et supprimer NSURLConnection, en utilisant sa
(NSString *)description
clé.L'objet que j'ai choisi pour
setObject:forKey
est l'URL unique qui est utilisée pour l'initiationNSURLRequest
, lesNSURLConnection
utilisations.Une fois défini, NSURLConnection est évalué à
la source
Une approche que j'ai adoptée consiste à ne pas utiliser le même objet que le délégué pour chaque connexion. Au lieu de cela, je crée une nouvelle instance de ma classe d'analyse pour chaque connexion qui est déclenchée et définit le délégué sur cette instance.
la source
Essayez ma classe personnalisée, MultipleDownload , qui gère tout cela pour vous.
la source
Je crée généralement une gamme de dictionnaires. Chaque dictionnaire a un peu d'informations d'identification, un objet NSMutableData pour stocker la réponse et la connexion elle-même. Lorsqu'une méthode de délégué de connexion se déclenche, je recherche le dictionnaire de la connexion et le gère en conséquence.
la source
Une option consiste simplement à sous-classer NSURLConnection vous-même et à ajouter une méthode -tag ou similaire. La conception de NSURLConnection est intentionnellement très simple, c'est donc parfaitement acceptable.
Ou peut-être pourriez-vous créer une classe MyURLConnectionController qui est responsable de la création et de la collecte des données d'une connexion. Il n'aurait alors qu'à informer votre objet contrôleur principal une fois le chargement terminé.
la source
dans iOS5 et au-dessus, vous pouvez simplement utiliser la méthode de classe
sendAsynchronousRequest:queue:completionHandler:
Pas besoin de garder une trace des connexions puisque la réponse revient dans le gestionnaire d'achèvement.
la source
J'aime ASIHTTPRequest .
la source
Comme indiqué par d'autres réponses, vous devez stocker connectionInfo quelque part et les rechercher par connexion.
Le type de données le plus naturel pour cela est
NSMutableDictionary
, mais il ne peut pas accepterNSURLConnection
comme clé car les connexions ne sont pas copiables.Une autre option pour utiliser
NSURLConnections
comme clés dansNSMutableDictionary
consiste à utiliserNSValue valueWithNonretainedObject]
:la source
J'ai décidé de sous-classer NSURLConnection et d'ajouter une balise, un délégué et un NSMutabaleData. J'ai une classe DataController qui gère toute la gestion des données, y compris les demandes. J'ai créé un protocole DataControllerDelegate, afin que les vues / objets individuels puissent écouter le DataController pour savoir quand leurs demandes ont été terminées et, si nécessaire, combien a été téléchargé ou quelles erreurs. La classe DataController peut utiliser la sous-classe NSURLConnection pour démarrer une nouvelle demande et enregistrer le délégué qui souhaite écouter le DataController pour savoir quand la demande est terminée. C'est ma solution de travail dans XCode 4.5.2 et ios 6.
Le fichier DataController.h qui déclare le protocole DataControllerDelegate). Le DataController est également un singleton:
Les méthodes clés dans le fichier DataController.m:
Et pour lancer une requête:
[[NSURLConnectionWithDelegate alloc] initWithRequest:request delegate:self startImmediately:YES tag:@"Login" dataDelegate:delegate];
Le NSURLConnectionWithDelegate.h: @protocol DataControllerDelegate;
Et le NSURLConnectionWithDelegate.m:
la source
Chaque NSURLConnection a un attribut de hachage, vous pouvez tout discriminer par cet attribut.
Par exemple, j'ai besoin de conserver certaines informations avant et après la connexion, donc mon RequestManager a un NSMutableDictionary pour le faire.
Un exemple:
Après demande:
la source