web-dev-qa-db-ja.com

NSURLSession:URLリクエストのタイムアウトを増やす方法

IOS 7の新しいNSURLSessionDataTaskを使用して、次のようにデータを取得しています。

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:
request completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
//
}];

エラー"The request timed out"NSURLErrorDomain Code = -1001内)を回避するために、タイムアウト値を増やすにはどうすればよいですか?

NSURLSessionConfiguration のドキュメントを確認しましたが、タイムアウト値を設定する方法が見つかりませんでした。

ご協力ありがとうございました!

59
AlexR

ObjC

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;

Swift

let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 30.0
sessionConfig.timeoutIntervalForResource = 60.0
let session = URLSession(configuration: sessionConfig)

ドキュメントが言うこと

timeoutIntervalForRequestおよびtimeoutIntervalForResourceは、リクエストとリソースのタイムアウト間隔を指定します。

timeoutIntervalForRequest-追加データを待機するときに使用するタイムアウト間隔。この値に関連付けられたタイマーは、新しいデータが到着するたびにリセットされます。要求タイマーが新しいデータを受信せずに指定された間隔に達すると、タイムアウトをトリガーします。

timeoutIntervalForResource-リソース要求が許可される最大時間。この値は、リソース全体が転送されるまで待機する時間を制御します。リソースタイマーは、要求が開始されると起動し、要求が完了するか、このタイムアウト間隔に達するかのいずれか早い方までカウントします。

NSURLSessionConfigurationクラスリファレンス に基づく

102
RaffAl

Swift開発者がここに来る場合

これを行うには、使用する必要があります

    let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    urlconfig.timeoutIntervalForRequest = 12
    urlconfig.timeoutIntervalForResource = 12
    self.session = NSURLSession(configuration: urlconfig, delegate: self.delegates, delegateQueue: nil)
16
Sruit A.Suk

Swiftで3.タイムアウト15秒。

    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForRequest = TimeInterval(15)
    configuration.timeoutIntervalForResource = TimeInterval(15)
    let session = URLSession(configuration: configuration)
8

NSURLSessionConfigurationには、プロパティtimeoutIntervalForRequestが含まれます。

@property NSTimeInterval timeoutIntervalForRequest

タイムアウト間隔を制御します。要求が開始された後のタイムアウト用のtimeoutIntervalForResourceもあります。

4
Wojtek Surowka

Swift 3.0では、使用する必要があります

 if let cleanURLString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed),
    let theURL: Foundation.URL = Foundation.URL(string: cleanURLString) {

    var task:URLSessionDataTask?
    let urlconfig = URLSessionConfiguration.default
    urlconfig.timeoutIntervalForRequest = 20
    urlconfig.timeoutIntervalForResource = 60
    let session = Foundation.URLSession(configuration: urlconfig, delegate: self, delegateQueue: OperationQueue.main)

    let request = URLRequest(url: theURL)
    request.httpMethod = "POST"
    request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    let paramString = YourParameterString
    request.httpBody = paramString.data(using: String.Encoding.utf8)

    task = session.dataTask(with: request) {
        (data, response, error) in
        // Do here
    })
    dataTask.resume()
}
2
Lineesh K Mohan

Swift 4の場合:

let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = TimeInterval(15)
config.timeoutIntervalForResource = TimeInterval(15)
let urlSession = URLSession(configuration: config)

TimeoutIntervalForRequestは、この構成に基づくセッション内のすべてのタスク用です。 timeoutIntervalForResourceは、この構成に基づくセッション内のすべてのタスク用です。

1
user9060380

私の場合、間違ったクラスのタイムアウトを増やしていました。タイムアウトエラーは、RLSessionではなくRLRequestのタイムアウトを増やすことで解決しました。

var request = URLRequest(url: url)
request.timeoutInterval = 30
0
Nico Dioso