NSURLConnection ou NSURLSession

muqaddarmuqaddar Administrateur
mai 2014 modifié dans Objective-C, Swift, C, C++ #1

Salut,


 


Je suis en train de passer à  AFNetworking 2.x.


 


Mon application ne sera plus compatible qu'avec iOS 7 (et iOS 8...). Vu que le futur, côté requêtes réseaux, semble être destiné à  NSURLSession, y-a-til un intérêt quelconque à  utiliser encore NSURLConnection ? Y compris pour une bête petite requête GET ?


 


D'autant plus qu'on sera de plus en plus amener à  connecter nos apps en background (et même à  faire de la synchro) et que NSURLSession semble être idéal pour cela ?


Réponses

  • perso, j'ai tout basculé en NSURLSession depuis que je suis passé à  AF2


  • AliGatorAliGator Membre, Modérateur
    NSURLConnection est encore viable, et ne sera pas déprécié de sitôt je pense, donc si tu fais qu'une ou 2 requêtes, pourquoi pas continuer à  l'utiliser.

    Mais c'est vrai que NSURLSession est quand même un peu la nouvelle norme / nouvelle façon de faire, et ça t'apporte de la flexibilité supplémentaire si un jour tu veux passer aux Background Fetch & co, ça t'ouvre de nouvelles possibilités.

    Pour les nouveaux projets (du moins ceux qui sont iOS7 minimum) je conseille de passer directement à  NSURLSession. Pour les existants, ça peut être une bonne idée de convertir son code existant, mais ce n'est pas primordial non plus si ça marche déjà  avec [NSURLConnection sendAsynchronousRequest:queue:completionHandler:].
  • muqaddarmuqaddar Administrateur
    mai 2014 modifié #4

    J'ai commencé à  tout passer sous NSURLSession.


     


    Tiens, je viens de voir qu'on ne pouvait pas utiliser NSURLSessionDataTask avec backgroundSessionConfiguration. Donc ce dernier mode ne peut fonctionner qu'avec du download et upload de fichier. Un peu déçu du coup. Donc si t'as un JSON de 5 Mo sous forme de data à  télécharger (on sait jamais...) quelle est la méthode officielle pour faire du background sans encombre ?


  • AliGatorAliGator Membre, Modérateur
    Bah download, puis une fois le download fini, au moment du completionBlock, lecture du fichier téléchargé en local puis parsing du JSON... non ?
  • muqaddarmuqaddar Administrateur
    mai 2014 modifié #6


    Bah download, puis une fois le download fini, au moment du completionBlock, lecture du fichier téléchargé en local puis parsing du JSON... non ?




     


    Je voulais m'arranger pour pas avoir des fichiers en lecture/écriture à  gérer, mais c'est une idée en effet. Je pourrais même m'arranger pour faire le parsing un peu quand je veux du coup (quand elle résume son état).


     


    Je suis en train de passer ma synchro sous NSURLSession ET par la même occasion en synchro automatique ET en background.


    ça fait 3 nouveautés à  gérer. Beau challenge. Il y a des allers-retours avec le serveur. Et beaucoup d'images à  télécharger.


     


    La grande inconnue c'est de savoir à  quel rythme lancer les synchros en background.


     


    L'inconvénient de ce que tu me dis, ça serait que même pour un bête login, il faudrait que je télécharge un fichier qui renvoie OK ou KO... (plutôt que la même chose en data)... pourquoi pas.


  • muqaddarmuqaddar Administrateur
    mai 2014 modifié #7

    Par contre, il n'y a pas d'équivalent de ça:



     [manager POST:PULL_PATH parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
        // register token
        self.token = [responseObject valueForKeyPath:@token];
        // compare server items to client items
        [self pullCompareServerItemsToClientItems:[responseObject valueForKeyPath:@items]];
      }
      failure:^(NSURLSessionDataTask *task, NSError *error) {
        DDLogError(@Error : %@", error);
      }];

    avec NSURLSessionDownloadTask.


     


    Or, c'est bien pratique pour envoyer un dico de données à  la volée (parameters).


     


    Du coup, je suis obligé d'utiliser:



      NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
        return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
      } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@File downloaded to: %@", filePath);
      }];
      [downloadTask resume];

    Et d'envoyer les paramètres "à  la mano" en NSData:



      NSString *json = [parameters JSONString];
      NSData *jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
      [request setHTTPMethod:@POST];
      [request setHTTPBody:jsonData];

    via NSMutableURLRequest dans setHTTPBody.


    Où alors, j'ai loupé une méthode de AFNetworking ?

Connectez-vous ou Inscrivez-vous pour répondre.