Synchrone AFNetworking Anrufe
Ich bin derzeit mit AFNetworking in einem meiner iPhone app. Es ist wirklich eine handliche Bibliothek, um asynchrone Aufrufe. Allerdings lief ich in Situationen in meiner Anwendung, wo ich brauche, um die Daten vom server, um vorwärts zu bewegen. Also dachte ich, dass dieser Weg wartet die Antwort zurück.
MyAFNetworkClient *httpClient = [MyAFNetworkClient sharedClient];
NSURLRequest *request = [httpClient requestWithMethod:@"GET" path:path parameters:nil];
__block int status = 0;
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:JSON];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){
@throw error.userInfo;
status = 2;
NSLog(@"Error... Status Code 2");
}];
[httpClient enqueueHTTPRequestOperation:operation];
[httpClient.operationQueue waitUntilAllOperationsAreFinished];
while (status == 0)
{
//run runloop so that async dispatch can be handled on main thread AFTER the operation has
//been marked as finished (even though the call backs haven't finished yet).
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate date]];
}
Mit diesem Stück code, ich bin in der Lage, die Antwort zu warten wieder aus dem server und in der Lage, weiter zu gehen. Es schien wirklich um mein problem zu lösen, jedoch nicht sicher, ob dies ist eine gute Möglichkeit, um die Aufrufe. Wenn es ist, ist es ein gutes design-Prinzip, wo ich kann, halten Sie den code gemeinsame und verwenden Sie es auf meine Anwendung.
Danke
- Ich denke, die Antworten/Kommentare hier veranschaulichen die Beurteilung aufgrund der Natur dieser Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nie-block der main (UI) - thread. Das heißt, nie die Vernetzung synchron.
Die ganze Zeit Ihre Anfrage lädt, es erscheint, dass Ihre Anwendung eingefroren hat—absolut nicht auf touch-und system-Ereignisse, bis die Anfrage beendet ist.
Zumindest, zeigen eine be-modal, die nicht entlassen, bis die Anfrage beendet ist. Noch besser, machen Sie es, damit ein Benutzer interagieren kann die app normal, während die Anfrage laden, wenn möglich.
Was Sie hier haben, mag technisch funktionieren, aber es ist inakzeptabel für eine Reale Anwendung.
Für alle von Ihnen, die in der gleichen situation sind, wo Sie sind, die asynchrone Aufrufe und wollen warten, bis die Daten wieder zurück auf den Haupt-thread für andere Sachen, dies könnte ein wenig Hilfe
Szenario:
Benutzer-Authentifizierung: Benutzer gibt Benutzername, Kennwort und Kennwort anzumelden versucht.
Lösung: Zeigen Sie, laden -, modal -, um Ihnen zu sagen, dass etwas Los ist hinter den kulissen, sobald Sie sich wieder die Antwort, können Sie fortfahren, um den Haupt-thread wie unten.
Dank @matt für den Tipp, was getan werden muss, um in solchen Fällen.