2014-10-31 1 views
1

Я выполняю простую загрузку данных из службы JSON. При вызове запрос возвращает объект ответа nil. Кажется, это тот же код, который я использовал несколько раз, но теперь я в тупике, почему запрос возвращает нуль. Я проверил, что сгенерированный URL-адрес действителен и возвращает данные. Мне что-то не хватает? Благодаря!NSURLRequest return nil

NSString *serviceEndpoint = [NSString stringWithFormat:@"http://waterservices.usgs.gov/nwis/iv/?sites=%@&period=PT%luH&format=json", guageID, hours]; 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:serviceEndpoint]]; 

NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
// response is nil at this point 
NSDictionary *rvData = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonError]; 
+1

попытаться кодировать строку, используя '[NSURL URLWithString: [ServiceEndpoint stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]'. –

+0

Не игнорируйте параметр ошибки метода: 'sendSynchronousRequest'. Предоставьте параметр «NSError» и запишите его, когда метод возвращает nil. – zaph

+1

Aargh! Синхронные URLRequests в основном потоке блокируют пользовательский интерфейс! У вас нет уважения к опыту пользователя? – Anorak

ответ

4

Вы полностью пренебрегая NSError и NSURLResponse, которые также населенный от метода sendSynchronousRequest.

Сначала добавьте чек, чтобы узнать, было ли заполнено NSError (если NSURLResponse, если nil), и если он не равен нулю, вы должны проверить его, чтобы определить проблему запроса. Вы также можете взять пик в объект NSURLResponse также наблюдать любые свойства, чтобы помочь отладить проблему:

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://waterservices.usgs.gov/nwis/iv/?sites=%@&period=PT%@luH&format=json", guageID, hours]]; 
[request setHTTPMethod:@"GET"]; 
[request setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"content-type"]; 
NSError *err; 
NSURLResponse *response; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
if (responseData != nil) 
{ 
    NSDictionary *jsonArray = [NSJSONSerialization JSONObjectWithData:responseData options: NSJSONReadingMutableContainers error: &err]; 
} 
else 
{ 
    if (error != nil) 
    { 
     NSLog(@"Error description=%@", [err description]); 
    } 
} 
+3

Не пытайтесь проверить параметр 'error' для nil, один проверяет метод sendSynchronousRequest для nil и если nil рассмотрел параметр ошибки. параметр ошибки не гарантированно равен нулю, если нет ошибки. – zaph

+0

Ну ладно, обновленный ответ, спасибо за предложение. –

+1

Утверждение о выражении формата wrt hours, скорее всего, неверно, часы очень хорошо представляют собой целое число некоторого типа (возможно, без знака) и спецификатор формата '% lu' будет правильным. '% @' предназначен только для объектов. – zaph