2016-03-13 1 views
1

Ce problème a déjà été mentionné ailleurs mais la solution traitait de l'erreur. Et là je pense que je gère correctement mon erreur (mais on dirait que je me trompe ...).Le crash NSURLSession avec le paramètre de données JSON est nul alors que l'erreur est gérée

J'ai quelque chose d'étrange que je n'arrive pas à comprendre. Mon application se bloque lorsque je vérifie si un serveur ne répond pas (hors ligne) et non en récupérant un objet JSON. Dans mes souvenirs cela fonctionnait avant que je traite avec iOS 9.2. En utilisant le point d'arrêt d'exception, je peux voir qu'il s'agit d'un paramètre de données "nul" lors de la création d'un dictionnaire (ce qui est normal puisque le serveur est hors ligne et ne retourne rien) mais le crash devrait être évité en gérant l'erreur ... ce qui ne semble pas être le cas dans mon code.

Quelques lignes:

NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; // url with php script have been set before... 

[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setHTTPBody:[noteDataString dataUsingEncoding:NSUTF8StringEncoding]]; 

NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *dataRaw, NSURLResponse *response, NSError *error) { 
    NSDictionary *json = [NSJSONSerialization 
          JSONObjectWithData:dataRaw 
          options:kNilOptions error:&error]; 

    // I thought this condition below should manage the error when the json dictionary cannot be set because of the nil "dataRay" paramater but my app crashes. 
    if (error) { 
     UIAlertView * av = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Checking permission:\nGot error %@.\n", error] message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
     [av show]; 
     // (I know UIAlertView is deprecated in iOS 9.0 :-)...) 
    } 

    NSString *status = json[@"status"]; 

    if([status isEqual:@"1"]){ 
     //Success in php script 

     UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"It works" message:nil delegate:self cancelButtonTitle:@"Cool" otherButtonTitles:nil, nil]; 
     [av show]; 

    } 

Il semble que le cas (erreur) condition ne l'empêche pas de tomber en panne ...

Quelqu'un pourrait me aider?

Merci!

Répondre

5

Vous devriez juste ajouter un bloc if après avoir initié votre JSON. Tels que:

if(rawData != nil) { 
    NSDictionary *json = [NSJSONSerialization 
          JSONObjectWithData:dataRaw 
          options:kNilOptions error:&error]; 
} 

Ensuite, vous pouvez gérer votre erreur si elle n'est pas nulle.

+0

Cela semble si évident ... :-) Merci! – Trichophyton