webentwicklung-frage-antwort-db.com.de

NSURLConnection in iOS9 veraltet

Ich möchte eine Datei mit einem NSURLRequest herunterladen und diese aber in der Zeile mit dem speichern

NSData * data = ... Passiert ein Fehler.

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];

Die Warnmeldung lautet, dass ich NSURLSession dataTaskwithrequest "Verwenden sollte, da sendSynchronousRequest in iOS 9 veraltet ist, aber das funktioniert nicht. Ich hoffe, jemand kann mir helfen

19
Maximilian

Jetzt musst du NSURLSession benutzen

Beispiel (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];
}

Jetzt müssen Sie diese Methode mit einer Aktion (oder Ihrer vollständigen URL, wenn Sie dies vorziehen) und dem Block aufrufen, der ausgeführt wird, wenn der API-Aufruf zurückkehrt.

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

Innerhalb dieses Blocks erhalten Sie ein NSData mit den Antwortdaten und ein NSURLResponse mit der HTTP-Antwort. Nun können Sie Ihren Code dort einfügen:

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

[data writeToURL:documentsURL atomically:YES];

Hauptunterschied zwischen NSURLSession und NSURLConnection

  • NSURLConnection: Wenn wir eine offene Verbindung mit NSURLConnection haben und das System unsere App unterbricht, gingen alle empfangenen oder gesendeten Daten verloren, wenn unsere App in den Hintergrundmodus wechselt. Process diagram for NSURLConnection

  • NSURLSession: Lösen Sie dieses Problem und geben Sie uns auch keine Prozess-Downloads. Es verwaltet den Verbindungsprozess, auch wenn wir keinen Zugriff haben. Sie müssen application:handleEventsForBackgroundURLSession:completionHandler in Ihrem AppDelegate Process diagram for NSURLSession

Mit der Verwendung von NSURLSession müssen Sie Ihre Internetverbindung nicht verwalten oder überprüfen, da das Betriebssystem dies für Sie erledigt.

34
EnriMR