24

新しい NSURLSession では、セッションの作成に使用される NSURLSessionConfiguration オブジェクトに timeoutIntervalForRequest が存在するようになりました。

ただし、セッションで NSURLSessionTask を作成するために使用できる NSURLRequest オブジェクトにはまだ timeoutInterval があります。

私の質問は、構成で timeoutIntervalForRequest が 30 に設定されているが、タスクを作成するために使用する NSURLRequest で timeoutInterval が 60 である場合、実際に使用されるタイムアウト間隔はどれですか?

4

4 に答える 4

23

私の iOS 7.0.3 での調査によると、timeoutIntervalforNSURLRequestは と一緒に使用しても効果がありませんNSURLSession

timeoutIntervalForRequest設定するNSURLSessionConfigurationかどうかtimeoutIntervalは無視されます。

私の小さなサンプル アプリケーションNetworkTimeoutSampleを使用して、この動作を確認できます。

timeoutIntervalに影響する「URLReq」フィールドに 1 を設定しNSURLRequest、「NSURLSession With URLRequest」ボタンをクリックすると、セッションでタイムアウト エラーが発生しなくなります。

また、 of に対して同じタイムアウト効果を得たい場合は、 forのtimeoutIntervalForResource代わりに を設定する必要があることに気付くかもしれません。timeoutIntervalForRequestNSURLSessiontimeoutIntervalNSURLRequest

timeoutIntervalForRequesttimeoutIntervalForResourcevalue の両方を設定するとNSURLSessionConfiguration、小さい方の値が影響を受けます (現在の API ドキュメントとは動作が異なると思います)。

これらの仕様に関するドキュメントはありませんので、将来の iOS バージョンで変更される可能性があります。

于 2013-11-04T06:54:56.433 に答える
5

iOS8 以降、サーバーが応答しない場合、バックグラウンド モードの NSUrlSession はこのデリゲート メソッドを呼び出しません。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error ダウンロード/アップロードは無期限にアイドル状態のままです。このデリゲートは、サーバーが応答しない場合に iOS7 で呼び出され、エラーが発生します。

一般に、NSURLSession バックグラウンド セッションは、ネットワーク上で問題が発生した場合でもタスクを失敗させません。むしろ、リクエストを実行するのに適した時期を探し続け、その時点で再試行します。これは、リソースのタイムアウトが期限切れになるまで続きます (つまり、セッションの作成に使用する NSURLSessionConfiguration オブジェクトの timeoutIntervalForResource プロパティの値)。その値の現在のデフォルトは 1 週間です。つまり、iOS7 のタイムアウトで失敗する動作は正しくありませんでした。バックグラウンド セッションのコンテキストでは、ネットワークの問題が原因ですぐに失敗しない方が興味深いです。そのため、iOS8 以降、タイムアウトやネットワーク ロスが発生しても NSURLSession タスクは続行されます。ただし、timeoutIntervalForResource に達するまで続行されます。

したがって、基本的に timeoutIntervalForRequest はバックグラウンド セッションでは機能しませんが、timeoutIntervalForResource は機能します。

この回答は、開発者フォーラムの Apple スタッフのメンバーの 1 人から得ました。また、実装することでこれを確認しました。

于 2016-02-12T19:39:49.757 に答える