Как найти, почему NSMutableData недействителен - PullRequest
0 голосов
/ 15 марта 2010

Я получаю доступ к RESTFUL URL и получаю обратно результаты. Результаты в формате JSON. Я превращаю ответ в строку через:

- (void)connectionDidFinishLoading:(NSURLConnection   *)connection {
NSString *json = [[NSString alloc] initWithBytes:[self.receivedData mutableBytes] length:[self.receivedData length] encoding:NSUTF8StringEncoding];

Переменная json имеет значение 0x0. Когда я наводю на него курсор мыши, я вижу <Invalid CFStringRef>. Как я могу отладить это, чтобы сказать, почему это недействительно? Я отрисовываю JSON, возвращенный через браузер, в парсере JSON. Это хорошо.

Результаты возвращаются путем ввода идентификатора в URL. Другие идентификаторы возвращают результаты без проблем. Результирующий набор довольно большой.

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

Сначала я бы использовал initWithData:encoding: для настройки строки NSString. Небольшая разница, но у этого метода есть причина.

Затем я бы сделал шестнадцатеричную запись self.receivedData, чтобы посмотреть, что там на самом деле. Если эти данные неправильно закодированы в UTF8, то initWithData:encoding: завершится ошибкой.

(Google для шестнадцатеричного дампа NSData, чтобы найти для этого полезные функции других людей)

Я обнаружил, что иногда веб-сервисы небрежно относятся к своей кодировке. Поэтому я обычно применяю запасной вариант так:

NSString* html = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
if (html == nil) {
    html = [[NSString alloc] initWithData: data encoding: NSISOLatin1StringEncoding];
    if (html == nil) {
        html = [[NSString alloc] initWithData: data encoding: NSMacOSRomanStringEncoding];
    }
}

Прискорбно, что это требуется, но многие веб-службы не написаны и не настроены должным образом.

1 голос
/ 15 марта 2010

Используйте NSLog для просмотра байтов.

...