Я создаю NSMutableRequest
:
self.req = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
Тайм-аут устанавливается равным 10 секундам, потому что я не хочу, чтобы пользователь слишком долго ждал ответа.
После этого я создаю a NSURLSessionDataTask
:
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:self.req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse * httpResp = (NSHTTPURLResponse *)response;
if (error) {
// this is where I get the timeout
}
else if (httpResp.statusCode < 200 || httpResp.statusCode >= 300) {
// handling error and giving feedback
}
else {
NSError *serializationError = nil;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&serializationError];
}
[task resume];
}
Проблема заключается в том, что сервер переходит в Gateway Timeout, и это занимает много времени. Я получаю ошибку тайм-аута, и я даю обратную связь пользователю, но все последующие вызовы API не срабатывают одинаково из-за ошибки тайм-аута. Единственный способ остановить это - убить приложение и начать все заново. Есть ли что-то, что я должен сделать, чтобы убить задачу или соединение после ошибки таймаута? Если я не установлю тайм-аут, и я жду, пока не получу код ошибки с сервера, все следующие вызовы будут работать отлично (но пользователь ждет много!).
Я попытался отменить задачу:
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:self.req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse * httpResp = (NSHTTPURLResponse *)response;
if (error) {
// this is where I get the timeout
[task cancel];
}
...
[task resume];
}