linkedin

Il y a des moments dans la vie de chacun où nous savons que nous devons nous asseoir et faire quelque chose de désagréable pour notre propre bien : préparer une déclaration d’impôts, créer un profil OkCupid, supprimer un profil OkCupid, se raser les orteils, etc. Se forcer à apprendre une nouvelle API peut sembler tout aussi désagréable, mais il faut souvent le faire.

ASIHTTPRequest. Qu’est-ce que je peux dire ? Je n’ai pas de problème avec elle. Je l’adore. Il est simple et me permet de créer rapidement du code qui envoie des requêtes HTTP en seulement quelques lignes. Voici un exemple où j’envoie un Post et un File :

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:remoteUrl] ; [request setPostValue:self.fileName.text forKey:@"name"] ; [request setFile:filePath forKey:@"filename"] ; [request setDelegate:self] ; [request startAsynchronous];

J’adore ça : je définis la valeur Post et sa clé, je définis le File et sa clé, je me crée un délégué et je démarre le téléchargement ! Le protocole me notifie quand c’est fait et je peux passer à autre chose.

Malheureusement, ASIHTTPRequest a été écrit par un homme qui en a eu assez de faire face à ses fans et à ses détracteurs. Il a donc décidé d’abandonner le projet. C’est la bénédiction/le problème des projets Open-Source : ils sont libres/tenus. Bien que le code existe toujours (et fonctionne toujours), il ne le mettra pas à jour pour les futures versions d’iOS. Il a même déclaré sur son blog qu’il était temps pour nous tous de passer à autre chose. Voici AFNetworking.

Les bonnes gens de Gowalla (anciennement Alamofire) ont créé une API de requête HTTP que de nombreuses personnes commencent à utiliser. Mais je dis bien commencer. C’est vraiment nouveau. J’ai même jeté un coup d’œil dans le code de quelqu’un d’autre qui a implémenté la bibliothèque d’AFNetworking pour voir comment il l’utilisait ; ce n’est pas le cas. Ils l’ont incluse et l’ont abandonnée pour continuer à utiliser ASIHTTPRequest :)

Donc, en ce qui concerne la documentation, il n’y en a toujours pas beaucoup. Cela me laisse dans la position de devoir apprendre par moi-même.

Première tâche : Installer la documentation AFNetworking dans Xcode

L’un des meilleurs outils de Xcode est sa capacité à vous montrer la documentation d’un élément en deux clics. A ma grande surprise, j’ai découvert qu’il est possible d’installer la documentation des APIs tierces si elles la fournissent, ce qui est le cas de Gowalla. Mais vous devez d’abord acquérir un outil appelé appledoc et l’installer. Il se présente sous la forme d’un projet Xcode ET inclut un script shell d’installation. Si vous l’utilisez, vous aurez la voie libre. Ensuite, suivez les instructions de Gowalla pour installer leur documentation depuis GitHub. Maintenant, lorsque vous avez besoin de documentation pour une classe AFNetworking, une méthode, etc, elle est disponible au même endroit que la documentation de la Fondation Apple !

Will-Code-Img_0.png

Deuxième tâche : Mettre en place le téléchargement de fichiers

Là, c’était difficile. Le code nécessaire pour faire la même chose que ci-dessus est beaucoup plus long (je ne vois pas en quoi c’est un avantage, j’aime les choses succinctes)

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:remoteUrl] ; NSMutableURLRequest *afRequest = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/photos" parameters:nil constructingBodyWithBlock : ^(id <AFMultipartFormData>formData) { [formData appendPartWithFileData:photoImageData name:self.fileName.text fileName :[NSString stringWithFormat:@"%@.jpg", self.fileName.text] mimeType:@"image/jpeg"] ; } ; } ; AFHTTPRequestWithMethod:@"POST" path:@"/photos" parameters:nil ] ; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest] ; [operation setUploadProgressBlock : ^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite) ; } ] ; NSOperationQueue *queue = [[NSOperationQueueue alloc] init] ; [queue addOperation:operation] ; [self takeADeepBreath];

D’accord. Ce code est très difficile à lire au premier coup d’œil. Décomposons-le.

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:remoteUrl];`

Ceci init une nouvelle instance de l’objet AFHTTPClient qui est l’endroit où vous ferez souvent le gros du travail dans cette API. Notez la méthode de commodité pour mettre l’URL dans son initialisation. Mais notez également qu’il s’agit de l’URL de base. Cela nous permet de faire des appels faciles à d’autres URL relatives dont nous avons besoin en ajoutant simplement le /[directory].

NSMutableURLRequest *afRequest = [httpClient

C’est logique. C’est ce que nous faisons vraiment : Faire des requêtes d’URL. Ici, nous utilisons notre instance de AFHTTPClient pour commencer à extraire les informations que nous voulons mettre dans notre requête.

multipartFormRequestWithMethod:@"POST" path:@"/photos"

Nous allons poster dans le répertoire web des photos, qui se trouve à une distance de notre URL de base. Nous pouvons également mettre en place ou supprimer.

parameters:nil

Je ne sais toujours pas ce que c’est. Que quelqu’un m’envoie un email pour me le dire :)

constructingBodyWithBlock : ^(id <AFMultipartFormData>formData) {

“BLOCKS !!!!!?????” Oui. Les blocs. Il est temps de devenir un homme et d’utiliser un bloc. Et maintenant que je l’ai fait, je n’ai plus peur. Il me semble que les blocs fonctionnent comme de petites fonctions au sein des méthodes. Je suppose que cela nous permet d’économiser un peu d’espace en n’ayant pas à les déclarer, etc. Mais ils sont très intimidants. Mais ils sont très intimidants, surtout quand ils ne sont pas enseignés dans les cours d’introduction à l’iPhone.

Imaginez un bloc de la manière suivante : c’est une fonction qui peut être appelée en tant qu’argument. Quand je le dis comme ça, c’est VRAIMENT utile !

Après les deux points, on met une carotte (^) pour définir le début du bloc. Il est suivi par le type de retour (dans ce cas, une instance de l’objet AFMultipartFormData appelée formData). Ouvrez une accolade et démarrez la fonction !

[formData appendPartWithFileData:photoImageData name:self.fileName.text fileName :[NSString stringWithFormat:@"%@.jpg", self.fileName.text] mimeType:@"image/jpeg"];

Un message et nous en avons terminé avec celui-ci. Mais attendez. Comment se fait-il que nous utilisions le retour dans la fonction ? Eh bien, peut-être que “return” n’est pas le bon mot. Il s’agit en fait d’un argument Un argument qui est alimenté par la méthode qui l’appelle ? Oy. …

formData est une instance de AFMultipartFormData que la méthode nous donne à jouer dans le bloc (avec désinvolture.) Et dans ce cas, nous prenons cette instance et la remplissons avec les données que nous voulons envoyer dans notre corps HTTP :

le fichier (dans ce cas, une photo),

la valeur de la clé ‘name’ (que je tire d’un UITextField) et

la clé ‘fileName’ (qui ici est juste le ‘name’ avec une extension.

}

] ;

Fermez maintenant ce bloc ET le message d’origine !

De cette façon, nous avons maintenant notre requête HTTP Post prête à être lancée. Dans ASIHTTP, il suffirait de lui dire startSynchronous ou startAsynchronous pour qu’elle se mette en route. Ici, nous devons accepter que les bonnes applications utilisent Grand Central Dispatch.

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest];

AFHTTPRequestOperation hérite de AFURLConnectionOperation qui hérite de NSOperation. NSOperation est la classe qui nous permet d’encapsuler des tâches individuelles et de les transmettre aux processeurs avec plus de contrôle. Nous pouvons prendre des tâches et les mettre en file d’attente par threads et le compilateur ou le système d’exploitation ou autre sait en fait sur quel cœur de processeur les placer pour qu’elles puissent s’exécuter simultanément !

Les avantages de cette méthode sont évidents : confiez cette tâche à un cœur de processeur afin que les autres tâches ne soient pas bloquées en attendant que le délai d’attente de votre URL brisée soit écoulé ou que votre énorme fichier soit téléchargé sur Edge. Si vous l’utilisez correctement, vous pouvez éviter les blocages liés au HTTP dans votre application.

[operation setUploadProgressBlock : ^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite) ; } ];

ALERTE DE BLOCAGE ! Mais c’est encore utile. Ce bloc analyse la progression de notre téléchargement pour nous et nous donne les données à utiliser comme bon nous semble. Décomposons : il nous donne 3 ints pour jouer avec :

bytesWritten, totalBytesWritten, et totalBytesExpectedToWrite

Vous voulez faire une barre de progression ? Voici son modèle ! Ce bloc s’exécute CHAQUE FOIS QU’UN PAQUET EST ENVOYÉ, ce qui nous donne des variables utiles constamment mises à jour. (Je commence vraiment à aimer ce genre de choses !)

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

Il s’avère que vous ne pouvez pas mettre ces NSOperations directement au travail. Il faut les mettre dans une NSOperationQueue. J’aimerais ne pas avoir à le faire. J’aimerais pouvoir leur envoyer un message de démarrage et qu’elles s’en aillent. Peut-être un jour.

[queue addOperation:operation];

Compilez et c’est parti ! Regardez votre application afficher une image.

Si vous cherchez la solution pour remplacer ASHttpRequest par AFNetworking, contactez-nous dès aujourd’hui !

Besoin d'aide ?

Vous pensez qu'il est peut-être temps d'apporter une aide supplémentaire ?

Door3.com