2013-02-28 3 views
0

У меня возникла странная проблема с ответом от api. В connectionDidFinishLoading при регистрации ответа в виде строки [NSString stringWithUTF8String:[self.response bytes]] строка иногда записывается правильно, иногда имеет значение NULL, а в других случаях - правильный ответ со случайными символами, добавленными в конце.Xcode NSURLConnection NSMutableData appdendData работает только иногда

В didReceiveData ответ прекрасен, но проблема возникает после использования appendData. В didReceiveData я могу проиллюстрировать эту проблему так:

// This is always 0 
NSLog(@"data length is %i", [data length]); 
// This is always the correct response string sent from the api 
NSLog(@"data string is %@", [NSString stringWithUTF8String:[data bytes]]); 

NSMutableData *foo = [[NSMutableData alloc] init]; 
[foo appendData:data]; 

// This is always 8 
NSLog(@"foo length is %i", [foo length]); 
// This is only sometimes the correct response string! 
NSLog(@"foo string is %@", [NSString stringWithUTF8String:[foo bytes]]); 

[foo release]; 
foo = nil; 

Я видел пару других вопросов на SO о подобных сумасшедших проблем с appendData, но они, кажется, были, так как переменная, добавленными была равна нулю. Это показывает, что я ясно объявил о своем NSMutableData foo, но он все еще не корректно установлен.

+2

stringWithUTF8String будет считать, что байты находятся в utf8. что может не дать правильных результатов. Ответ Фабиана Крейзера - лучший подход. – Mohammad

ответ

2

Пожалуйста, разместите весь код, а не только этот короткий отрывок.

Я предполагаю, что вы перераспределяете новый экземпляр NSMutableData каждый раз, когда вызывается -connection:didReceiveData:. Для этого вам нужно использовать свойство или iVar, чтобы данные были добавлены к уже имеющимся данным, когда -connection:didReceiveData: называется последующими.

- (void)startConnection 
{ 
    self.receivedData = [[NSMutableData alloc] init]; 
    // Start connection... 
} 

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

- (void)connectionDidFinishLoading:(NSURLConnection *) 
{ 
    NSString *receivedString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; 
    self.receivedData = nil; 

    NSLog(@"Response: %@", receivedString); 
} 
+0

Извините, подумал, что сужение его поможет. Мой метод преобразования в строку был проблемой, ваш исправил ее. –

+0

Итак, для потомков получите строку из данных с помощью этого '[[NSString alloc] initWithData: self.receivedData encoding: NSUTF8StringEncoding]' не с этим '[NSString stringWithUTF8String: [self.receivedData bytes]]'. Спасибо! –