2009-07-10 9 views
5

Ho davvero faticato per capire perché la mia chiamata al servizio web è piena di dati spazzatura.NSURLConnection delegate didReceiveData caratteri finali nei dati

Ho un UITableViewController che chiama il servizio Web e funge anche da NSURLConnectionDelegate.

Ecco il metodo di interesse delegato, prendere nota delle istruzioni NSLog.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    NSLog(@"data %@", [[NSString alloc] initWithUTF8String: [data bytes]]); 
    NSLog(@"before %@", [NSString stringWithUTF8String: self.rawData.bytes]); 
    [self.rawData appendData:data]; 
    NSLog(@"after %@", [NSString stringWithUTF8String: self.rawData.bytes]); 
} 

Ecco il registro risultante dopo un certo numero di tentativi:

2009-07-10 09:04:20.339 SundialInvoice[91493:20b] data {"items": [], "request": 

"/inventory/delivered.json"} 
2009-07-10 09:04:20.339 SundialInvoice[91493:20b] before 
2009-07-10 09:04:20.340 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:23.153 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}l 4] [Mes 
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] before 
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:27.913 SundialInvoice[91493:20b] data (null) 
2009-07-10 09:04:27.913 SundialInvoice[91493:20b] before 
2009-07-10 09:04:27.914 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:30.486 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}ice/1.0 CFN 
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] before 
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

Dove sono i dati spazzatura finali provenienti da? Ho eseguito il servizio web con arricciatura diverse volte e la spazzatura non viene da esso.

risposta

6

penso che la spazzatura viene dalla registrazione:

[NSString stringWithUTF8String:self.rawData.bytes] 

Qui si sta dicendo che si desidera un NSString da questo C-string (= array di byte terminato da zero). Il problema è che il metodo bytes di NSDatanon restituisce dati terminati da uno zero, perché è un ordinario array, non una C-string. Pertanto, l'inizializzatore NSString acquisisce i byte anche dopo la fine del NSData ricevuto, fino a quando raggiunge qualche byte zero precedentemente memorizzato.

1

provare quanto segue:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [rawData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"%@",rawData); 
} 

anche che cosa hai dichiarato rawData come ???

11

Per creare un NSString da un NSData, si dovrebbe usare initWithData:encoding:, come la seguente:

NSString *str = [[NSString alloc] initWithData:self.rawData 
             encoding:NSUTF8StringEncoding]; 
NSLog(@"Before: %@", str); 
[str release]; 

Trattare NSData byte come C stringa potrebbe causare alcune vulnerabilità di sicurezza.

Problemi correlati