2009-07-10 10 views
5

Naprawdę walczyłem, aby dowiedzieć się, dlaczego moje wezwanie do serwisu internetowego jest usiane błędnymi danymi.Delegacja NSURLConnection didReceiveData ciągłe znaki w danych

Mam UITableViewController, który wywołuje usługę sieci web, a także działa jako NSURLConnectionDelegate.

Oto delegowana metoda zainteresowania, zwróć uwagę na instrukcje 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]); 
} 

Oto uzyskany dziennik po kilku próbach:

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 

Gdzie jest końcowe dane na śmieci pochodzących z? Kilka razy uruchamiałem usługę WWW z lokówkami, a śmieci nie pochodzą od niej.

Odpowiedz

6

myślę śmieci pochodzi z wyrębu:

[NSString stringWithUTF8String:self.rawData.bytes] 

Tutaj mówisz, że chcesz się NSString z tego C-string (= tablicę bajtów rozwiązana przez zero). Problem polega na tym, że metoda bytes nie zwraca danych zakończonych przez zero, ponieważ jest to zwykła tablica, a nie ciąg C-owy. Dlatego też inicjator NSString pobiera nawet bajty po zakończeniu odebranego NSData, aż osiągnie pewien bajt zerowy uprzednio zapisany w pamięci.

1

spróbuj wykonać następujące czynności:

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

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

także co ty oświadczył rawData jak ???

11

Aby utworzyć NSString z NSData, należy użyć initWithData:encoding:, jak następuje:

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

Leczenie NSData bajtów jako ciąg C może powodować pewne luki w zabezpieczeniach.

Powiązane problemy