Abrufen von Daten aus der NSURLResponse Abschluss block
Wie es aussieht, habe ich nicht bekommen, das Konzept der Blöcke, die vollständig noch...
In meinem code habe ich, um aus der JSON-Daten aus der asychronous block
zurückgebracht werden, aus der ' outer
' - Methode. Ich gegoogelt und gefunden, dass, wenn die Definition einer variable with __block
, die Sichtbarkeit _mutability_ of
diese variable erweitert, um die block
.
Aber aus irgendeinem Grund zurückgegebenen json-Objekt ist null.Ich Frage mich, warum?
- (NSMutableDictionary *)executeRequestUrlString:(NSString *)urlString
{
__block NSMutableDictionary *json = nil;
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPShouldHandleCookies:YES];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
NSString *cookieString = [self.userDefaults objectForKey:SAVED_COOKIE];
[request addValue:cookieString forHTTPHeaderField:@"Cookie"];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue currentQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
NSLog(@"dataAsString %@", [NSString stringWithUTF8String:[data bytes]]);
NSError *error1;
NSMutableDictionary * innerJson = [NSJSONSerialization
JSONObjectWithData:data
options:kNilOptions
error:&error1];
json = innerJson;
}];
return json;
}
InformationsquelleAutor brainray | 2012-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, um Ihre Frage zu beantworten:
Die variable, die Sie zurückgeben wurde nicht auf die Zeit, wenn Sie zurückkehren. Sie können nicht ernten Sie die Ergebnisse unmittelbar nach der
sendAsynchronousRequest:queue:completionHandler:
Methode zurückgekehrt: der Aufruf hat zu beenden die hin-bevor Sie wieder Ihren block und Einstellungjson
variable.Heute ein kurzer Hinweis auf das, was zu tun ist: Ihre Methode versucht, zum konvertieren eines asynchronen Aufrufs in einen synchronen. Versuchen Sie, halten Sie es asynchron, wenn Sie können. Statt zu erwarten, dass eine Methode, die zurückgibt einen
NSMutableDictionary*
, eine Methode, die einen block von seinen selbst, und übergeben Sie das Wörterbuch zu blockieren, wenn diesendAsynchronousRequest:
Methode abgeschlossen:InformationsquelleAutor dasblinkenlight
Beim Aufruf
sendAsynchronousRequest:queue:completionHandler:
, die Sie angefordert haben eine asynchrone Anfrage. Also, es reiht die Anforderung und den block und sofort ein Ergebnis zurückgibt. Irgendwann in der Zukunft die Anforderung gestellt wurde, und irgendwann nach, dass der Abschluss-block ausgeführt. Aber zu der Zeit,return json
längst laufen.Wenn Sie wollen in der Lage sein, um wieder die Daten synchron, dann müssen Sie eine synchrone Anfrage. Das hängt in diesem thread, bis es abgeschlossen ist, es muss also nicht der Haupt-thread.
InformationsquelleAutor Rob Napier
Überprüfen Sie die Zeichenfolge bei der Konvertierung von Daten aus server verwenden Sie folgenden code:
wenn die Zeichenfolge in einen korrekten JSON-format, die NUR dann Ihre JSON-Objekt wird richtig sein.
Hoffe, das hilft!!
InformationsquelleAutor Manish Verma