Сделать удалённый запрос к серверу, не забывая о таймауте достаточно просто.
Допустим у вас есть URL с которого вам нужно получить данные. И если данные не получены за 5 секунд - то выдаём ошибку.
В приведённом примере я получаю JSON строку и преобразую её в словарь NSDictionary.
Создаём класс с именем Requests.
В .h файле:
-(NSDictionary*) getRequestResponse:(NSString*)url;
В .m файле:
-(NSDictionary*) getRequestResponse:(NSString*)url{
//задаю таймаут в 5 секунд
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:0 timeoutInterval:5];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *jsonData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
//проверка - не прилетела ли ошибка
if ([error.userInfo objectForKey:@"NSLocalizedDescription"] == NULL) {
//ответ от сервера пришел. В том числе 404 или 50x ошибка.
NSError *errorParse = nil;
//пробую распарсить JSON строку
id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&errorParse];
if (errorParse == nil){
//ответ сервера получилось распарсить
return result;
}
else {
//ошибка парсинга ответа сервера
NSString *errorCode = [NSString stringWithFormat: @"%d", errorParse.code];
NSDictionary *errInfo = errorParse.userInfo;
NSDictionary *error = [NSDictionary dictionaryWithObjectsAndKeys:[errInfo objectForKey:@"NSDebugDescription"], @"error", errorCode, @"error_code", nil];
return error;
}
}
else {
//ошибка таймаута
NSString *errorCode = [NSString stringWithFormat: @"%d", error.code];
NSDictionary *errInfo = error.userInfo;
NSDictionary *error = [NSDictionary dictionaryWithObjectsAndKeys:[errInfo objectForKey:@"NSLocalizedDescription"], @"error", errorCode, @"error_code", nil];
return error;
}
return nil;
}
Применение:
NSString *url = @"http://site-address.ru/temp/json.php";
NSDictionary *myJson = [[[Requests alloc] init] getRequestResponse:url];