2009-07-10 7 views
5

Realmente he tenido problemas para descubrir por qué mi llamada al servicio web está plagada de datos basura.NSURLConnection delegar didReceiveData caracteres finales en los datos

Tengo un UITableViewController que llama al servicio web y también actúa como NSURLConnectionDelegate.

Aquí está el método delegado de interés, tenga en cuenta las declaraciones 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]); 
} 

Aquí está el registro resultante después de varios intentos:

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 

Dónde están los datos de basura se arrastran procedentes de? He ejecutado el servicio web con curl varias veces y la basura no proviene de él.

Respuesta

6

creo que la basura proviene de la tala:

[NSString stringWithUTF8String:self.rawData.bytes] 

Aquí está diciendo que quiere una NSString de esta cadena tipo C (= array de bytes terminada por cero). El problema es que el método bytes de NSDatano devuelve datos con un cero, porque es una matriz común, no una cadena C. Por lo tanto, el inicializador NSString captura incluso los bytes después del final del NSData recibido, hasta que alcanza un byte cero previamente almacenado en la memoria.

1

pruebe lo siguiente:

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

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

también lo has declarado rawData como ???

11

para crear un NSString de un NSData, se debe utilizar initWithData:encoding:, como la siguiente:

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

tratamiento NSData bytes como C cadena podría causar algunos problemas de seguridad.

Cuestiones relacionadas