web-dev-qa-db-fra.com

NSURLConnection déconseillé dans iOS9

Je veux télécharger un fichier avec un NSURLRequest et l'enregistrer mais dans la ligne avec le

NSData * data = ... se produit une erreur.

NSURL *Urlstring = [NSURL URLWithString:@"http://yourdomain.com/yourfile.pdf"];
NSURLRequest *request = [NSURLRequest requestWithURL: Urlstring];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

Le message d'avertissement est que je dois utiliser NSURLSession dataTaskwithrequest "car sendSynchronousRequest est déconseillé dans iOS 9 mais cela ne fonctionne pas J'espère que quelqu'un pourra m'aider

19
Maximilian

Vous devez maintenant utiliser NSURLSession

Exemple (GET):

-(void)placeGetRequest:(NSString *)action withHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))ourBlock {

    NSString *urlString = [NSString stringWithFormat:@"%@/%@", URL_API, action];


    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock] resume];
}

Vous devez maintenant appeler cette méthode avec une action (ou votre URL complète si vous préférez) et le bloc qui sera exécuté lorsque l'appel d'API reviendra.

[self placeGetRequest:@"action" withHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // your code
}];

À l'intérieur de ce bloc, vous recevrez un NSData avec les données de réponse et NSURLResponse avec la réponse HTTP. Alors maintenant, vous pouvez y mettre votre code:

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

Différence principale entre NSURLSession et NSURLConnection

  • NSURLConnection: si nous avons une connexion ouverte avec NSURLConnection et que le système interrompt notre application, lorsque notre application passe en mode arrière-plan, tout ce que nous avons reçu ou envoyé a été perdu. Process diagram for NSURLConnection

  • NSURLSession: résolvez ce problème et donnez-nous également des téléchargements hors processus. Il gère le processus de connexion même lorsque nous n'y avons pas accès. Vous devrez utiliser application:handleEventsForBackgroundURLSession:completionHandler dans votre AppDelegate Process diagram for NSURLSession

Ainsi, avec l'utilisation de NSURLSession, vous n'avez pas besoin de gérer ou de vérifier votre connexion Internet car OS le fait pour vous.

34
EnriMR