gpt4 book ai didi

ios - 请求时间过长时取消 NSURLSession dataTask

转载 作者:行者123 更新时间:2023-11-29 01:11:11 81 4
gpt4 key购买 nike

在某些网站上,以下方法无限期挂起,我想在请求花费太长时间时取消请求,我认为 timeoutIntervalForRequesttimeoutIntervalForResource 会控制这一点,但是设置其中任何一个似乎都没有任何效果。

这是一个请求无限期挂起的示例网站:http://www.samtoft.co.uk/showpic.php?id=542&order=&search=#header

// fetch data from URL with NSURLSession
class func getDataFromServerWithSuccess(myURL: String, noRedirect: Bool, callback: Result<String> -> Void) {

var loadDataTask: NSURLSessionDataTask? = nil
let sessionConfig: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()

sessionConfig.timeoutIntervalForRequest = 10.0
sessionConfig.timeoutIntervalForResource = 10.0

var myDelegate: MySession? = nil
if noRedirect {
myDelegate = MySession()
}

let session = NSURLSession(configuration: sessionConfig, delegate: myDelegate, delegateQueue: nil)
loadDataTask = session.dataTaskWithURL(NSURL(string: myURL)!) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in


if let checkedData = data {

let success = Result.Success(NSString(data: checkedData, encoding: NSASCIIStringEncoding) as! String)


callback(success)

} else {

let redirectError = NetworkError.FailedUrl("\(myURL) + \(error)")


if let request = loadDataTask?.currentRequest {

guard let urlExtension = request.URL?.pathExtension else {return}
guard let domain = request.URL?.host else {return}



guard let finalURLAsString = request.URL?.description else {return}
let failure = Result.Failure("\(finalURLAsString) + \(redirectError)")
callback(failure)

}

}
}
loadDataTask!.resume()


}

编辑:对于遇到与我相同问题的任何人,问题是我正在考虑成功案例和错误案例,但没有考虑请求返回无响应的情况,因此我添加了以下内容:

if response == nil {
print("NO RESPONSE \(myURL)")
let noResponse = Result.NoResponse("NO RESPONSE")
callback(noResponse)
}

最佳答案

我已将您的代码提取为

func getDataFromServerWithSuccess(myURL: String) {
var loadDataTask: NSURLSessionDataTask? = nil
let sessionConfig: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()

//sessionConfig.timeoutIntervalForRequest = 11.0
sessionConfig.timeoutIntervalForResource = 11.0

let session = NSURLSession(configuration: sessionConfig)
loadDataTask = session.dataTaskWithURL(NSURL(string: myURL)!) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in

print("end")
}

loadDataTask!.resume()
}

它确实对超时敏感。我想委托(delegate)人可能有问题,无法正确接收响应。希望这会有所帮助。

关于ios - 请求时间过长时取消 NSURLSession dataTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735901/

81 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com