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 mais pour une raison quelconque, un objet JSON renvoyé est NIL.Je merveille pourquoi? p> 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>
- (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;
}
3 Réponses :
Lorsque vous appelez 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. P> Sendasynchronousrequest: Queue: Terminéhandler: Code>, vous avez demandé une demande asynchrone em>. 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 code> a depuis longtemps exécuté. P>
Premièrement, pour répondre à votre question:
Mais pour une raison quelconque, l'objet JSON renvoyé est
nil code>. Je me demande pourquoi? P> blockQuote>
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: Code> 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 code> 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 * code>, faites une méthode qui prend un bloc à part et transmettez le dictionnaire à ce bloc lorsque le
sendasynchronousrequest: code> est terminé: p>
xxx pré> p>
Vérifiez la chaîne lors de la conversion de données provenant du serveur à l'aide du code ci-dessous: si la chaîne est au format JSON approprié, alors que votre objet JSON sera correct. P> J'espère que ces halets !! p> p>