Je suis en train de repenser mon approche de l'architecture de demande d'une grande application que je développe. J'utilise actuellement ASIHTTPRequest pour réellement faire des demandes, mais comme j'ai besoin de nombreux types de demandes différents en raison de nombreuses actions différentes prises dans différents contrôleurs de vue, j'essaie de trouver le meilleur système d'organisation de ces demandes.
Je suis en train de créer des "demandeurs" singleton qui sont conservés par le délégué de l'application et assis à écouter les NSNotifications qui signalent qu'une demande doit être faite; ils font la demande, écoutent la réponse et envoient une nouvelle NSNotification avec les données de réponse. Cela résout la plupart de mes problèmes, mais ne gère pas avec élégance les demandes ayant échoué ou les demandes simultanées adressées au même demandeur singleton.
N'importe qui a du succès à concevoir une architecture claire, OO pour faire de nombreux types de demandes dans une application iOS?
Après avoir essayé plusieurs approches, c'est une architecture qui me donne d'excellents résultats, facile à documenter, à comprendre, à maintenir et à étendre:
Quoi qu'il en soit, c'est ainsi que je le fais depuis un certain temps, et franchement, cela fonctionne plutôt bien. Je peux étendre le système horizontalement, en ajoutant plus de sous-classes ASIHTTPRequest selon mes besoins, et le cœur du gestionnaire de réseau reste intact.
J'espère que ça aide!
Voici comment je le fais généralement. Moi aussi, j'ai un objet singleton utilisé pour faire des requêtes réseau. Pour les demandes qui doivent être faites souvent, j'ai un NSOperationQueue qui accepte AFHTTPRequestOperations (ou AFJSONRequestOperations) car j'utilise généralement AFNetworking pour faire des demandes. Pour ceux-ci, il existe une propriété d'achèvementBlock et failureBlock qui est exécutée en cas de succès ou d'échec de la demande. Sur mon objet singleton, j'aurais une méthode pour lancer une requête réseau particulière, et comme paramètres de cette méthode, j'inclurais un bloc de réussite et d'échec qui peut être passé dans les blocs définis dans la méthode. De cette façon, l'application entière peut effectuer une demande réseau et la portée de l'application à ce stade est disponible pour le singleton dans le bloc qui est transmis à la méthode. Par exemple ... (en utilisant ARC)
@implementation NetworkManager
-(void)makeRequestWithSuccess:(void(^)(void))successBlock failure:(void(^)(NSError *error))failureBlock
{
NSURL *url = [NSURL URLWithString:@"some URL"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
[responseObject doSomething];
if (successBlock)
dispatch_async(dispatch_get_main_queue(), successBlock);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failureBlock)
dispatch_async(dispatch_get_main_queue(), ^{
failureBlock(error);
});
}];
[self.operationQueue addOperation:op];
}
@end
Et vous pouvez toujours faire en sorte que le bloc de réussite prenne tous les paramètres dont vous avez besoin.
Essayez STNetTaskQueue , ce qui peut rendre votre demande réutilisable et maintenable.
Le projet entièrement chargé est une bonne lecture.