8
votes

Obtenir des données du bloc d'achèvement de Nsurlreesponse

On dirait que je n'ai pas reçu le concept de blocs complètement pourtant ...

Dans mon code, je dois sortir les données JSON du bloc asychroneux code> pour être retourné à partir de la méthode ' externe code>'. Je googled et j'ai constaté que si défini une variable avec __block code>, le Vìiì ¶sìsì ¶ì¶¶¶ -¶ -¶ -¶iì¶tì¶Y춶¶ _Mutabilité_ de code> La variable est étendue au bloc code> p>

mais pour une raison quelconque, un objet JSON renvoyé est NIL.Je merveille pourquoi? p>

- (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;
}


0 commentaires

3 Réponses :


2
votes

Lorsque vous appelez Sendasynchronousrequest: Queue: Terminéhandler: , vous avez demandé une demande asynchrone . Il faut donc filtrer la demande et le bloc et revient immédiatement. À un moment donné, la demande est faite, et un point après que le bloc d'achèvement est exécuté. Mais à ce moment-là, Retour JSON a depuis longtemps exécuté.

Si vous souhaitez pouvoir retourner les données de manière synchrone, vous devez faire une demande synchrone. Cela accrochera ce fil jusqu'à ce qu'il se termine, il ne faut donc pas être le fil principal.


0 commentaires

20
votes

Premièrement, pour répondre à votre question:

Mais pour une raison quelconque, l'objet JSON renvoyé est nil . Je me demande pourquoi?

La variable que vous retournez n'a pas été définie à l'époque où vous le retournez. Vous ne pouvez pas récolter les résultats immédiatement après le sendasynchronousrequest: File d'attente: ComplétionHandler: La méthode est retournée: L'appel doit terminer le volet aller-retour avant de rappeler votre bloc et de votre réglage JSON variable. < / P>

Maintenant une note rapide sur quoi faire à ce sujet: votre méthode tente de convertir un appel asynchrone en un synchrone. Essayez de le garder asynchrone si vous le pouvez. Plutôt que d'attendre une méthode qui renvoie un nsmutmictionnaire * , faites une méthode qui prend un bloc à part et transmettez le dictionnaire à ce bloc lorsque le sendasynchronousrequest: est terminé: xxx


0 commentaires

0
votes

Vérifiez la chaîne lors de la conversion de données provenant du serveur à l'aide du code ci-dessous: xxx

si la chaîne est au format JSON approprié, alors que votre objet JSON sera correct.

J'espère que ces halets !!


0 commentaires