2016-10-10 2 views
-1

j'ai écrit ce code pour faire une requête HTTP à un serveur qui envoie à moi une chaîne JSON:NSURLSession (iOS 10) Réponse de coupe à partir d'un serveur

-(NSDictionary*)doRequestWithCommand:(NSString*)command andBody:(NSString*)requestBody { 
    __block NSDictionary *result = nil; 
    NSURL *URL = [NSURL URLWithString: [NSString stringWithFormat:@"%@%@", PREFIX_URL, command] ]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:60.0]; 
    [request setHTTPMethod:REQUEST_TYPE_POST]; 
    [request setHTTPBody:[requestBody dataUsingEncoding:NSUTF8StringEncoding]]; 
    dispatch_semaphore_t sem = dispatch_semaphore_create(0); 
    __block BOOL done = NO; 
    while (!done) { 
     NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
      if (data != nil) { 
       result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
       NSLog(@"%@", [[NSString alloc] initWithData:data encoding:4]); 
       NSLog(@"len %lu", [[[NSString alloc] initWithData:data encoding:4] length]); 
       done = YES; 
      } 
      dispatch_semaphore_signal(sem); 
     }]; 
     [dataTask resume]; 
     dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 
    } 
    return result; 
} 

Ce code fonctionne très bien avec iOS 9 et inférieur , mais avec iOS 10 non! Pratiquement la réponse du serveur est coupée 1610ème caractère!

Je ne sais pas ce qui se passe! Pouvez-vous m'aider?

Merci

+0

Vous devez examiner l'objet d'erreur renvoyé par 'dataTaskWithRequest'. Est-ce que c'est «nul»? En outre, vous devez capturer l'objet d'erreur retourné par 'JSONObjectWithData' et voir si c'est« nil »ou non. Chaque fois que le code ne fonctionne pas, la première chose à faire est de commencer à examiner les objets d'erreur. – Rob

+0

La référence 'result' est-elle' nil'? Si 'nil', je suspecterais un problème dans la réponse JSON du serveur. Créez-vous ce fichier JSON manuellement ou utilisez-vous l'API pour le créer pour vous? Encore une fois, s'il y a un problème, l'objet d'erreur retourné par 'JSONObjectWithData' vous dira ce qui, si quelque chose, est faux avec le JSON. – Rob

+0

L'erreur est nulle! Et la réponse (résultat) n'est pas nulle, mais est coupée d'iOS. La réponse est générée à partir du serveur et est complète et correcte! Si j'essaye de faire une demande d'un client de repos, la réponse est correcte et non coupée, donc le problème est iOS, mais je ne sais pas ce que c'est! – frank

Répondre

1

Cette utilisation complète de dispatch_semaphore_t est faux, et vous ne devriez jamais avoir été fait en premier lieu. Si vous devez faire quelque chose après l'arrivée du data, faites-le dans le gestionnaire de complétion, juste après la ligne où data est défini; ne joue pas à des jeux sémaphores idiots et essaie de le faire après le gestionnaire de complétion. Vous ne pouvez pas renvoyer un résultat d'une méthode qui utilise un réseau asynchrone, basé sur les données de ce réseau. Vous ne pouvez pas.

+3

Vous avez raison de ne pas utiliser de sémaphore, mais ne répond pas à la question. Le sémaphore ne rendrait pas compte du comportement qu'il décrit. – Rob

+0

@Rob Je ne le sais pas. Peut-être que le sémaphore est déverrouillé et c'est pourquoi ses données sont restreintes. – matt

+0

Tbh cela devrait probablement être un commentaire Matt;) Ont été signalés dans les messages de qualité médiocre. Je vais laisser ici, mais j'espère que vous pouvez le faire migrer vers un commentaire. – brandonscript