Warten auf Abschluss-block komplett in ein AFNetworking Anfrage
Mache ich eine JSON-Anforderung mit AFNetworking und rufen Sie dann [operation waitUntilFinished] zu warten auf die operation und den Erfolg oder Misserfolg Blöcke. Aber, es scheint zu fallen, stimmt allerdings - in Bezug auf die log-Meldungen, die ich bekomme "0", "3", "1" statt "0", "1", "3"
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://google.com"]];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
httpClient.parameterEncoding = AFFormURLParameterEncoding;
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:@"query", @"q", nil];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:[url path] parameters:params];
NSLog(@"0");
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *innerRequest, NSHTTPURLResponse *response, id JSON) {
NSLog(@"1");
gotResponse = YES;
} failure:^(NSURLRequest *innerRequest, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"2");
gotResponse = YES;
}];
NSLog(@"Starting request");
[operation start];
[operation waitUntilFinished];
NSLog(@"3");
- Es scheint, als ob der Aufruf
[operation waitUntilFinished]
wartet nicht auf den Abschluss blockiert. AFJSONRequestOperation.m führt Sie mitdispatch_async
denen ich denke, dass wird Teil eines separaten Betrieb. Ist das richtig und gibt es da einen Weg drumherum?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser arbeitet mit AFNetworking eingerichtet, die Anfragen, aber eine synchrone rufen Sie dann die Handhabung der Fertigstellung der Blöcke manuell. Sehr einfach. AFNetworking nicht scheinen, um dies zu unterstützen https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ, aber die Arbeit ist einfach genug.
Sollte (fast) arbeiten. Ihr Aufruf
sollte wohl nicht passieren
[url path]
zu denpath:
parameter. In AFNetworking land-dieser Weg ist alles, was nach der Basis-url (zum Beispiel die Basis-url sein könnte "http://google.com" und der Pfad "/Google Mail" oder was auch immer).Dass gesagt wird, es ist wahrscheinlich nicht eine gute Idee, um die asynchrone operation in eine thread-Sperrung synchronen Betrieb mit waitUntilFinished, aber ich bin sicher, Sie haben Ihre Gründe... 😉
Ich hatte gerade das gleiche problem und finden eine andere Lösung. Ich hatte zwei Operationen, die voneinander abhängen, aber laden kann, parallel. Aber der Abschluss-block der zweiten operation kann nicht ausgeführt werden, bevor der Abschluss-block der erste fertig ist.
Als Colin wies darauf hin, es könnte eine schlechte Wahl, um eine web-Anfrage blockieren. Dies war entscheidend für mich, also hab ich es asynchron.
Dies ist meine Lösung:
Verwenden Sie Delegieren den Aufruf der Methode
Setzen Sie die Methode, die im inneren block, die sich selbst aufrufen, wenn der Download/Upload abgeschlossen ist.