2010-08-21 7 views
1

J'ai une connexion NSURLConnection qui reçoit des données provenant d'une URL pointant vers un script PHP sur mon serveur.NSURLConnection Données rompues en connexion asynchrone

La plupart du temps tout fonctionne correctement et les données sont récupérées dans leur forme complète.

Cependant, parfois je reçois NULL ou brisée (la moitié inférieure) des données à:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

Lorsque cela se produit, si je recharge la connexion elle retourne toujours le même nul ou bloc cassé de données pour la demande. J'ai réalisé que lorsque je reçois ce que je pensais être des données nulles, j'ai effectivement reçu des données mais le NSString créé à partir de ces données est nul. Je ne comprends toujours pas pourquoi. Ma sortie d'encodage php est toujours UTF-8 donc je ne pense pas que ce soit un problème d'encodage et d'ailleurs ça marche la plupart du temps avec ça.

J'ai vérifié le script php avec la même requête pour vérifier que ce n'est pas un problème du côté serveur ou avec le script php et confirmé que ce n'est PAS le cas.

Mon code est ci-dessous:

-(void)setUpConnectionAndMakeRequest { 

      NSString *URLpath = @"http://www.example.com/myphp.php"; 
    NSURL *myURL = [[NSURL alloc] initWithString:URLpath]; 

    NSMutableURLRequest *myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    [myURL release]; 
    [myURLRequest setHTTPMethod:@"POST"]; 


    //I added this because I thought it may be a problem relating to cache but it isn't 
    NSURLCache *cache = [NSURLCache sharedURLCache]; 
    [cache removeAllCachedResponses]; 


    NSString *httpBodystr = [NSString stringWithString:@"command=runscript"]; 


    [myURLRequest setHTTPBody:[httpBodystr dataUsingEncoding:NSUTF8StringEncoding]]; 


    [mailData setData:nil]; //mailData is a NSMutableData object which accumulates the data retrieved by the request 

    [NSURLConnection connectionWithRequest:myURLRequest delegate:self]; 

} 


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 

NSString *untrimmedDataSTR = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; //Created so I can see the data (always text) in NSLog 
NSLog(@"Live Data: %@", untrimmedDataSTR); //This is where I see that the data is broken or null when it shouldn't be 


[mailData appendData:data]; //Append accumulated data to NSMutableData object used later in my app. 

[untrimmedDataSTR release]; 

} 

Toute aide serait très apprécié.

+0

Etes-vous sûr que votre setUpConnectionAndMakeRequest n'est pas chargée deux fois avant la fin de la connexion? –

+0

J'ai eu exactement ce problème et la modification de l'encodage en ASCII l'a résolu. Etes-vous sûr que votre entrée est UTF-8? –

+2

Oui, la modification du codage en NSASCIIStringEncoding a résolu ce problème. Merci. – Zigglzworth

Répondre

4

Selon le NSString reference, -initWithData:encoding: renvoie zéro si "l'initialisation échoue pour une raison quelconque (par exemple si les données ne représentent pas des données valides pour le codage)".

Cela signifie presque certainement que la réponse du serveur n'est pas, en fait, des données codées UTF-8.

La façon de vérifier serait NSLog les données avant essayer de convertir en un NSString:

NSLog(@"Raw Data: %@", data); 

(La méthode -description sur NSData renvoie une représentation hexadécimale du contenu, c'est ce qui être enregistré).