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
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.
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
Mit der Verwendung von NSURLSession müssen Sie Ihre Internetverbindung nicht verwalten oder überprüfen, da das Betriebssystem dies für Sie erledigt.