2009-07-10 4 views
5

Я действительно пытался выяснить, почему мой вызов веб-службы пронизан нежелательными данными.делегат NSURLConnection didReceiveData завершающие символы в данных

У меня есть UITableViewController, который вызывает веб-службу, а также действует как NSURLConnectionDelegate.

Вот интересующий делегат метод, обратите внимание на инструкции 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]); 
} 

Вот полученный лог после нескольких попыток:

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 

Где подходит задние данные от мусора? Я несколько раз запускал веб-сервис с завитком, и мусор не исходил от него.

ответ

6

Я думаю, что мусор поступает из рубки:

[NSString stringWithUTF8String:self.rawData.bytes] 

Вот вы говорите, что вы хотите NSString от этого C-строки (= массив байт, заканчивающийся нуль). Проблема в том, что метод bytesNSDataне возвращает данные, оканчивающиеся нулем, потому что это обычный массив, а не C-строка. Поэтому инициализатор NSString захватывает даже байты после окончания принятого NSData, пока он не достигнет некоторого нулевого байта, ранее сохраненного в памяти.

1

попробуйте следующее:

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

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

Кроме того, что вы объявили RAWDATA, как ???

11

Чтобы создать NSString из NSData, вы должны использовать initWithData:encoding:, как следующее:

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

Лечение NSData байт, как C строка может вызвать некоторые уязвимости в системе безопасности.

Смежные вопросы