私は作成していNSMutableRequest
ます:
self.req = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
タイムアウトは 10 秒に設定されています。これは、ユーザーがフィードバックを得るのにあまり長く待たされたくないためです。その後、次を作成します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];
}
問題は、サーバーがゲートウェイ タイムアウトになり、時間がかかることです。タイムアウト エラーが発生し、ユーザーにフィードバックしますが、タイムアウト エラーが原因で、次の 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];
}