Zweiteilige Frage
Erster Teil: Ich versuche, eine ASynchrone Anforderung an meine Datenbank zu erstellen. Ich mache es derzeit synchron, aber ich möchte beide Möglichkeiten kennenlernen, um besser zu verstehen, was los ist.
Derzeit habe ich meinen synchronen Anruf so eingerichtet.
- (IBAction)setRequestString:(NSString *)string
{
//Set database address
NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http://127.0.0.1:8778/instacodeData/"]; // imac development
//PHP file name is being set from the parent view
[databaseURL appendString:string];
//call ASIHTTP delegates (Used to connect to database)
NSURL *url = [NSURL URLWithString:databaseURL];
//SynchronousRequest to grab the data
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSError *error;
NSURLResponse *response;
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (!result) {
//Display error message here
NSLog(@"Error");
} else {
//TODO: set up stuff that needs to work on the data here.
NSString* newStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
NSLog(@"%@", newStr);
}
}
Ich denke, ich muss den Anruf ersetzen
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
mit der ASynchronous-Version
sendAsynchronousRequest:queue:completionHandler:
Ich bin mir jedoch nicht sicher, was ich an die Warteschlange oder den CompletionHandler übergeben soll. Beispiele / Lösungen wären sehr willkommen.
Teil zwei: Ich habe über Multitasking gelesen und möchte es unterstützen, indem ich sicherstelle, dass meine Verbindungsanfragen vollständig sind, wenn ein Interrupt auftritt. Ich bin diesem Beispiel gefolgt
Darin wird erklärt, wie man mehr Zeit gewinnt, wenn ein Interrupt auftritt. Ich verstehe, was er tut. Aber nicht, wie man ihn auf diese Verbindung anwendet. Wenn Sie Beispiele / Tutorials haben, die mir helfen, herauszufinden, wie man sie anwendet, wäre das großartig!
quelle
NSURLErrorTimedOut
der akzeptierte Wert ist vorbeiERROR_CODE_TIMEOUT
.sendAsynchronousRequest:urlRequest queue:queue completionHandler:
wurde in iOS 9Hier ist ein Beispiel:
NSString *urlAsString = @"http://www.cnn.com"; NSURL *url = [NSURL URLWithString:urlAsString]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if ([data length] >0 && error == nil) { // DO YOUR WORK HERE } else if ([data length] == 0 && error == nil) { NSLog(@"Nothing was downloaded."); } else if (error != nil){ NSLog(@"Error = %@", error); } }];
quelle
Versuchen Sie für den Warteschlangenparameter diese Magie:
Dies funktioniert hervorragend, wenn Sie die Benutzeroberfläche nach Abschluss der Anforderung aktualisieren, da die Hauptwarteschlange der Hauptthread ist. Es gibt Ihnen im Wesentlichen das vorherige Verhalten von NSURLConnection. Wenn Sie jedoch vorhaben, in eine Datei zu schreiben oder zu dekomprimieren, können Sie eine Hintergrundwarteschlange erstellen und dann asynchron zur Hauptwarteschlange für die UI-Updates zurücksenden.
quelle
Ich habe auf ein ähnliches Problem arbeiten, habe ich geschrieben , diese Frage und bekam eine klare Antwort hier , ich hoffe , das hilft mit Teil 2.
Für Teil 1 sind die anderen hier genannten gut, aber Sie müssen einen weiteren Scheck hinzufügen (ich habe unten eine Antwort geändert). Es ist möglich, dass Ihre Anfrage einen 404-Fehler (Seite nicht gefunden) zurückgibt. In diesem Fall erhalten Sie keinen Fehler und die Daten sind> 0. Die 200 ist eine gute Antwort. Sie können auch den StatusCode für 404 oder was auch immer überprüfen .
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if ([data length] >0 && error == nil && [httpResponse statusCode] == 200) { // DO YOUR WORK HERE }
quelle
Da
sendAsynchronousRequest:urlRequest queue:queue completionHandler:
wurde in iOS 9 veraltet, und es wird empfohlen, stattdessenNSURLSession
's zu-dataTaskWithRequest:completionHandler:
verwenden. Es ist seit iOS 7 und höher verfügbar .Original:
NSURL *URL = [NSURL URLWithString:@"http://example.com"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { // ... }];
Von NSURLSession:
NSURL *URL = [NSURL URLWithString:@"http://example.com"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) { // ... }]; [task resume];
quelle
sendAsynchronousRequest
wurde in Swift veraltet. Bewegen Sie sich zudataTaskWithRequest
, zum Glück wird es so ziemlich genauso verwendet.if let url = NSURL(string:"http://your_url") { let request:NSURLRequest = NSURLRequest(URL: url) let config = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: config) let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in }); task.resume() }
quelle