2015-09-07 20 views
17

Ich möchte mit einem NSURLRequest eine Datei herunterzuladen und zu speichern, aber in der Zeile mit demNSURLConnection in iOS9 veraltet

NSData * data = ... passiert einen 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 ist, dass ich NSURLSession dataTaskwithrequest „verwenden sollten, weil sendSynchronousRequest 9 in iOS ist veraltet, aber das nicht funktioniert, ich hoffe jemand mir

+2

"Veraltet" ist kein Fehler. Es ist eine Warnung, dass in Zukunft etwas weggehen wird. Wenn Sie einen tatsächlichen Fehler haben, ist es wahrscheinlich aus einem anderen Grund. –

+0

Sry Sie sind richtig – Maximilian

Antwort

32

Jetzt kann Ihnen helfen NSURLSession

verwenden Beispiels (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 rufen Diese Methode mit einer Aktion (oder Ihrer vollständigen URL, falls Sie dies bevorzugen) und dem Block, der ausgeführt wird, wenn der API-Aufruf zurückkehrt.

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

Innerhalb dieser Blöcke werden Sie ein NSData mit den Antwortdaten und NSURLResponse mit der HTTP-Antwort erhalten. So, jetzt können Sie Ihren Code dort setzen:

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 unterbrechen unsere App, wenn Unsere App geht in den Hintergrundmodus, alles, was wir erhalten oder gesendet haben, ging verloren. Process diagram for NSURLConnection

  • NSURLSession: lösen Sie dieses Problem und geben Sie uns auch aus dem Prozess Downloads. Es verwaltet den Verbindungsprozess, auch wenn wir keinen Zugriff haben. Sie werden application:handleEventsForBackgroundURLSession:completionHandler in Ihrem AppDelegate Process diagram for NSURLSession

So mit dem Einsatz von NSURLSession verwenden müssen, Sie brauchen nicht zu verwalten oder Ihre Internetverbindung zu überprüfen, weil OS es für Sie tut.

+0

Ok Vielen Dank, aber was ist unserBlock es sagt undeclared Kennung – Maximilian

+0

Oh ja! ourBlock ist ein Block, den Sie definieren müssen. Es sollte den Quellcode enthalten, den Sie ausführen möchten, wenn der API-Aufruf beendet wurde. Ich werde meine Antwort bearbeiten, um Ihnen das vollständige Beispiel zu geben – EnriMR

+0

@Maximilian, überprüfen Sie jetzt meine aktualisierte Antwort und testen Sie es in Ihrem Projekt – EnriMR