NSURLRequest с использованием timeoutInterval

Опубликовано 2015.01.28

Сделать удалённый запрос к серверу, не забывая о таймауте достаточно просто. Допустим у вас есть URL с которого вам нужно получить данные. И если данные не получены за 5 секунд - то выдаём ошибку. В приведённом примере я получаю JSON строку и преобразую её в словарь NSDictionary. Создаём класс с именем Requests. В .h файле:
  1. -(NSDictionary*) getRequestResponse:(NSString*)url;
В .m файле:
  1. -(NSDictionary*) getRequestResponse:(NSString*)url{
  2. //задаю таймаут в 5 секунд
  3. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:0 timeoutInterval:5];
  4. NSURLResponse *response = nil;
  5. NSError *error = nil;
  6. NSData *jsonData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
  7. //проверка - не прилетела ли ошибка
  8. if ([error.userInfo objectForKey:@"NSLocalizedDescription"] == NULL) {
  9. //ответ от сервера пришел. В том числе 404 или 50x ошибка.
  10. NSError *errorParse = nil;
  11. //пробую распарсить JSON строку
  12. id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&errorParse];
  13. if (errorParse == nil){
  14. //ответ сервера получилось распарсить
  15. return result;
  16. }
  17. else {
  18. //ошибка парсинга ответа сервера
  19. NSString *errorCode = [NSString stringWithFormat: @"%d", errorParse.code];
  20. NSDictionary *errInfo = errorParse.userInfo;
  21. NSDictionary *error = [NSDictionary dictionaryWithObjectsAndKeys:[errInfo objectForKey:@"NSDebugDescription"], @"error", errorCode, @"error_code", nil];
  22. return error;
  23. }
  24. }
  25. else {
  26. //ошибка таймаута
  27. NSString *errorCode = [NSString stringWithFormat: @"%d", error.code];
  28. NSDictionary *errInfo = error.userInfo;
  29. NSDictionary *error = [NSDictionary dictionaryWithObjectsAndKeys:[errInfo objectForKey:@"NSLocalizedDescription"], @"error", errorCode, @"error_code", nil];
  30. return error;
  31. }
  32. return nil;
  33. }
Применение:
  1. NSString *url = @"http://site-address.ru/temp/json.php";
  2. NSDictionary *myJson = [[[Requests alloc] init] getRequestResponse:url];