web-dev-qa-db-fra.com

Quelles sont les principales fonctionnalités ASIHTTPRequest manquantes AFNetworking?

Avec le travail ayant récemment cessé sur ASIHTTPRequest , il semble que l'attention se déplace vers AFNetworking .

Cependant, je n'ai pas encore trouvé une bonne comparaison des fonctionnalités des deux bibliothèques, donc je ne sais pas ce que je pourrais perdre si/quand je basculerais.

Les principales différences que j'ai repérées jusqu'à présent sont:

  1. AFNetworking a une taille de code beaucoup plus petite (ce qui est bien)
  2. AFNetworking s'améliore rapidement (donc il n'est peut-être pas encore mature, peut-être pas encore une API stable?)
  3. Les deux semblent avoir une mise en cache, bien que j'aie vu des indices selon lesquels AFNetworking utilise NSURLConnection ne mettra pas en cache des objets de plus de 50 Ko
  4. ASIHTTPRequest a un très bon support pour les proxies http manuels et automatiques (PAC); Je ne trouve aucune information sur le niveau de support d'AFNetworking pour les proxys
  5. AFNetworking nécessite iOS 4+, tandis que ASIHTTPRequest fonctionne directement sur iOS 2 (pas vraiment un problème pour moi, mais c'est un problème pour certaines personnes)
  6. AFNetworking n'a pas (encore) de cache persistant intégré, mais il y a un cache persistant qui a une demande d'extraction en attente: https://github.com/gowalla/AFNetworking/pull/25

Quelqu'un a-t-il vu de bonnes comparaisons des deux bibliothèques ou des expériences documentées de passage de l'une à l'autre?

93
JosephH

J'ai adoré ASIHTTPRequest et j'étais triste de le voir disparaître. Cependant, le développeur d'ASI avait raison, ASIHTTPRequest est devenu si volumineux et gonflé que même il n'a pas pu consacrer de temps pour le mettre à niveau avec les dernières fonctionnalités d'iOS et d'autres cadres. J'ai déménagé et utilise maintenant AFNetworking.

Cela dit, je dois dire que AFNetworking est beaucoup plus instable que ASIHTTP, et pour les choses pour lesquelles je l'utilise, il a besoin d'être raffiné.

J'ai souvent besoin de faire des requêtes HTTP à 100 sources HTTP avant d'afficher mes résultats à l'écran, et j'ai mis AFHTTPNetworkOperation dans une file d'attente d'opérations. Avant de télécharger tous les résultats, je souhaite pouvoir annuler toutes les opérations dans la file d'attente des opérations, puis fermer le contrôleur de vue qui contient les résultats.

Ça ne marche pas toujours.

Je reçois des plantages à des moments aléatoires avec AFNetworking, tandis qu'avec ASIHTTPRequest, ces opérations fonctionnaient parfaitement. Je souhaite pouvoir dire quelle partie spécifique de AFNetworking plante, car elle continue de planter à différents points (cependant, la plupart du temps, le débogueur pointe vers NSRunLoop qui crée un objet NSURLConnection). Ainsi, AFNetworking doit mûrir pour être considéré aussi complet que l'était ASIHTTPRequest.

En outre, ASIHTTPRequests prend en charge l'authentification client, ce qui manque à AFNetworking pour le moment. La seule façon de l'implémenter est de sous-classer AFHTTPRequestOperation et de remplacer les méthodes d'authentification de NSURLConnection. Cependant, si vous commencez à vous impliquer dans NSURLConnection, vous remarquerez que placer NSURLConnection dans un wrapper NSOperation et écrire des blocs d'achèvement n'est pas si difficile qu'il y paraît et vous commencerez à penser à ce qui vous empêche de vider les bibliothèques tierces.

ASI utilise une approche complètement différente, car elle utilise CFNetworking (cadres de base de bas niveau basés sur C) pour rendre le téléchargement et le téléchargement de fichiers possibles, en ignorant complètement NSURLConnection et en touchant à des concepts que la plupart d'entre nous, les développeurs OS X et iOS, ont trop peur. Pour cette raison, vous obtenez un meilleur téléchargement et téléchargement de fichiers, même des caches de pages Web.

Lequel je préfère? C'est difficile à dire. Si AFNetworking mûrit suffisamment, je l'aimerai plus qu'ASI. Jusque-là, je ne peux m'empêcher d'admirer ASI et la façon dont il est devenu l'un des cadres les plus utilisés de tous les temps pour OS X et iOS.

EDIT:Je pense qu'il est temps de mettre à jour cette réponse, car les choses ont un peu changé après ce post.

Ce message a été écrit il y a quelque temps et AFNetworking a suffisamment mûri. Il y a 1 à 2 mois, AF a publié une petite mise à jour pour POST opérations qui était ma dernière plainte concernant le cadre (une petite erreur de fin de ligne était la raison pour laquelle les téléchargements échos ont échoué avec AF mais se sont bien terminés avec ASI). L'authentification n'est pas un problème avec AFnetworking, car pour les méthodes d'authentification complexes, vous pouvez sous-classer l'opération et passer vos propres appels et AFHTTPClient fait de l'authentification de base un jeu d'enfant. En sous-classant AFHTTPClient, vous pouvez faire un consommateur de service complet en peu de temps.

Sans parler des ajouts UIImage absolument nécessaires qu'offre AFNetworking. Avec des blocs et des blocs d'achèvement personnalisés et un algorithme intelligent, vous pouvez créer des vues de table avec le téléchargement d'image asynchrone et le remplissage de cellules assez facilement, alors qu'en ASI, vous deviez créer des files d'attente d'opérations pour la limitation de la bande passante et pensez à annuler et reprendre la file d'attente d'opérations selon visibilité de la table, et des trucs comme ça. Le temps de développement de ces opérations a été réduit de moitié.

J'aime aussi les blocs de réussite et d'échec. ASI n'a qu'un bloc d'achèvement (qui est en fait le bloc d'achèvement de NSOperation). Vous avez dû vérifier si vous aviez une erreur à la fin et agir en conséquence. Pour les services Web complexes, vous pourriez vous perdre dans tous les "ifs" et "elses"; Dans AFNetworking, les choses sont beaucoup plus simples et intuitives.

ASI était génial pour son époque, mais avec AF, vous pouvez changer complètement la façon dont vous gérez les services Web et rendre les applications évolutives plus facilement. Je crois vraiment qu'il n'y a plus aucune raison de rester avec ASI, sauf si vous souhaitez cibler iOS 3 et les versions antérieures.

59
csotiriou

Je termine juste un projet où j'utilise AFNetworking au lieu d'ASI. Avoir utilisé ASI sur des projets antérieurs; cela a été d'une grande aide dans le passé.

Voici ce qui manque à AFNetworking (à ce jour):

  • Rien

ASI s'en va . Utilisez AF maintenant. C'est petit, ça marche et ça va continuer à être supporté. Il est également organisé de manière plus logique, en particulier pour les clients API. Il a un certain nombre de grandes classes pour les cas spéciaux souvent utilisés comme le chargement asynchrone d'images dans les vues de table.

17
Jeff

AFNetworking ne prend pas en charge clientCertificateIdentity et clientCertificates pour l'authentification client TLS.

Nous pouvons le faire avec la méthode - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge dans une sous-classe de AFURLConnectionOperation mais ce n'est pas aussi simple.

4
Mathieu Hausherr

Jusqu'à maintenant Je ne pouvais pas comprendre comment définir un délai d'attente avec AFNetworking lors de la synchronisation synchrone POST request . MISE À JOUR: J'ai finalement compris: https: // stackoverflow. com/a/8774125/601466
Passage maintenant à AFNetworking:]

==================

Apple remplace le délai d'expiration d'un POST, le définissant sur 240 secondes (au cas où il aurait été réglé plus court que les 240 secondes), et vous ne pouvez pas le modifier. Avec ASIHTTP, vous venez de définir un délai d'attente et cela fonctionne.

Un exemple de code avec une demande synchrone POST:

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                                @"doSomething", @"task",
                                @"foo", @"bar",
                                nil];

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseURL]];

NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:requestURL parameters:params];
[httpClient release];

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NDLog(@"fail! %@", [error localizedDescription]);
}];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];

[queue addOperation:operation];
[queue waitUntilAllOperationsAreFinished]; // Stuck here for at least 240 seconds!

[[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
if (![[operation responseString] isEqualToString:@""]) {
    return [operation responseString];
}

return nil;

J'ai essayé de définir un délai ici, mais rien n'a fonctionné. Ce problème m'empêche de migrer vers AFNetworking.

Voir aussi ici: Comment définir un délai d'expiration avec AFNetworking

2
borisdiakur

J'utilise ASI * depuis un certain temps maintenant et j'aime vraiment l'approche fileupload d'ASI, et bien que je suis ravi de passer à AFNetworking, la prise en charge de fileupload dans AfNetworking n'est pas aussi facile à utiliser que ASI *.

2
Teo Choong Ping

AFNetwork n'a pas la possibilité de télécharger des fichiers volumineux. Il suppose que le contenu du fichier est dans la RAM. ASI était suffisamment intelligent pour simplement diffuser du contenu de fichier à partir du disque.

2
rosstulloch

Dans ASIHTTP, j'ai adoré pouvoir joindre un dictionnaire userinfo aux demandes individuelles. Pour autant que je vois, il n'y a pas de support direct pour cela dans AFHTTPRequestOperation. Quelqu'un a-t-il déjà trouvé une solution de contournement élégante? Mis à part le sous-classement trivial bien sûr.

0
Lvsti