2012-09-10 13 views
6

Es sieht aus wie ich nicht das Konzept der Blöcke vollständig noch bekommen habe ...Erste Daten aus dem NSURLResponse Abschluss Block

In meinem Code ich habe die JSON-Daten, um aus den asychronous block werden zurückgegeben aus der 'outer' Methode. Ich googelte und fand, dass, wenn ein variable with __block definiert wird, der v̶i̶s̶i̶b̶i̶l̶i̶t̶y̶ _mutability_ of diese Variable auf block erweitert wird.

Aber aus irgendeinem Grund zurückgegeben json Objekt ist nil.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; 
} 

Antwort

18

Zuerst Ihre Frage zu beantworten:

Aber aus irgendeinem Grund zurück json Objekt nil ist. Ich wundere mich warum?

Die Variable, die Sie zurückgeben, wurde zum Zeitpunkt der Rückgabe nicht festgelegt. Sie können die Ergebnisse nicht sofort erfassen, nachdem die Methode sendAsynchronousRequest:queue:completionHandler: zurückgegeben wurde: Der Aufruf muss den Roundtrip beenden, bevor er den Block zurückruft und die Variable json setzt.

Jetzt eine kurze Notiz darüber, was Sie dagegen tun können: Ihre Methode versucht, einen asynchronen Aufruf in einen synchronen umzuwandeln. Versuchen Sie es asynchron zu halten, wenn Sie können. Anstatt ein Verfahren erwartet, die ein NSMutableDictionary* zurückgibt, macht eine Methode, die einen Block von seinem eigenen nimmt, und das Wörterbuch zu diesem Block übergibt, wenn die sendAsynchronousRequest: Methode abgeschlossen:

- (void)executeRequestUrlString:(NSString *)urlString withBlock:(void (^)(NSDictionary *jsonData))block { 
    // Prepare for the call 
    ... 
    // Make the call 
    [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 
     ]; 
     block(innerJson); // Call back the block passed into your method 
     }]; 

} 
+1

Dies ist eine absolut brillante Antwort IMHO! Ich habe zwar einige Zeit gebraucht, um es zu verstehen, aber es hat sich gelohnt. Danke, ich habe viel gelernt! – brainray

2

Wenn Sie sendAsynchronousRequest:queue:completionHandler: nennen, haben Sie eine asynchrone Anfrage angefordert. Es reiht die Anfrage und den Block ein und kehrt sofort zurück. Irgendwann in der Zukunft wird die Anfrage gemacht, und irgendwann danach wird der Completion-Block ausgeführt. Aber zu dieser Zeit ist return json längst abgelaufen.

Wenn Sie die Daten synchron zurückgeben möchten, müssen Sie eine synchrone Anfrage stellen. Das wird diesen Thread bis zum Abschluss hängen, also muss es nicht der Hauptthread sein.

0

die Zeichenfolge überprüfen, wenn Daten vom Server kommende Umwandlung Verwenden Sie den folgenden Code:

Wenn die Zeichenfolge in einem richtigen JSON-Format ist, wird NUR dann das JSON-Objekt korrekt sein.

Hoffe, das hepls !!

Verwandte Themen