如何增加 URL 请求的超时时间?

我使用 iOS7的新 NSURLSessionDataTask检索数据如下:

NSURLSession *session = [NSURLSession sharedSession];


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

如何增加超时值以避免出现错误 "The request timed out"(在 NSURLErrorDomain Code = -1001中) ?

我已经检查了 NSULSessionConfiguration的文档,但是没有找到设置超时值的方法。

谢谢你的帮助!

86610 次浏览

NSULSessionConfiguration 包含 timeoutIntervalForRequest 属性:

@property NSTimeInterval timeoutIntervalForRequest

以控制超时间隔。在请求发起后,也有 timeoutIntervalForResource 用于超时。

目的

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

斯威夫特

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

医生怎么说

timeoutIntervalForRequesttimeoutIntervalForResource指定请求和资源的超时间隔。

timeoutIntervalForRequest -等待时使用的超时间隔 与此值关联的计时器被重置 当请求计时器到达 在不接收任何新数据的情况下,它触发一个 暂停。

timeoutIntervalForResource -a 资源请求应该允许采取。这个值控制如何 在放弃之前等待整个资源的转移 资源计时器在发起请求时启动,并计数到 要么请求完成,要么达到此超时间隔, 以先到者为准。

基于 配置类引用

以防斯威夫特开发商来这里

要做到这一点,你需要使用

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

在 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()
}

快速3秒,暂停15秒。

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

对于斯威夫特4:

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

TimeoutIntervalForRequest 适用于基于此配置的会话内的所有任务。 TimeoutIntervalForResource 适用于基于此配置的会话内的所有任务。

在我的情况下,我增加了错误类的时间。我的超时错误是通过增加 请求而不是 网址会话的超时来解决的

var request = URLRequest(url: url)
request.timeoutInterval = 30