检查 File 是否存在于 Web 服务器上的最简单解决方案。 (Swift)
Simpliest solution to check if File exists on a webserver. (Swift)
对此有很多讨论,我了解使用委托方法并检查响应“404”的解决方案:
var request : NSURLRequest = NSURLRequest(URL: url)
var connection : NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
connection.start()
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
//...
}
但我想要一个简单的解决方案,例如:
var exists:Bool=fileexists(sURL);
因为我会在同一个 class 中收到很多请求,而我只想用我的函数 fileexists() 检查响应。
有什么提示吗?
更新
我想我必须执行如下同步请求,但我总是得到 0x0000000000000000 作为响应::
let urlPath: String = sURL;
var url: NSURL = NSURL(string: urlPath)!
var request1: NSURLRequest = NSURLRequest(URL: url)
var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?
>=nil
var error: NSErrorPointer = nil
var dataVal: NSData = NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)!
var err: NSError
println(response)
检查服务器上是否存在资源需要发送 HTTP
请求和接收响应。 TCP 通信可能需要一些
时间量,例如如果服务器繁忙,则在服务器之间的某个路由器
客户端和服务器不工作
正确,网络中断等
这就是异步请求总是首选的原因。即使你认为
请求只需要几毫秒,有时可能是
秒由于一些网络问题。而且——众所周知——阻塞
主线程 几秒钟是一个很大的禁忌。
综上所述,这是一个可能的实现
fileExists()
方法。你不应该在主线程上使用它,
你已被警告!
HTTP请求方法设置为"HEAD",让服务器发送
只有响应头,没有数据。
func fileExists(url : NSURL!) -> Bool {
let req = NSMutableURLRequest(URL: url)
req.HTTPMethod = "HEAD"
req.timeoutInterval = 1.0 // Adjust to your needs
var response : NSURLResponse?
NSURLConnection.sendSynchronousRequest(req, returningResponse: &response, error: nil)
return ((response as? NSHTTPURLResponse)?.statusCode ?? -1) == 200
}
Swift 3.0 版本的 Martin R 异步编写的答案(主线程未阻塞):
func fileExistsAt(url : URL, completion: @escaping (Bool) -> Void) {
let checkSession = Foundation.URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
request.timeoutInterval = 1.0 // Adjust to your needs
let task = checkSession.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if let httpResp: HTTPURLResponse = response as? HTTPURLResponse {
completion(httpResp.statusCode == 200)
}
})
task.resume()
}
对此有很多讨论,我了解使用委托方法并检查响应“404”的解决方案:
var request : NSURLRequest = NSURLRequest(URL: url)
var connection : NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
connection.start()
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
//...
}
但我想要一个简单的解决方案,例如:
var exists:Bool=fileexists(sURL);
因为我会在同一个 class 中收到很多请求,而我只想用我的函数 fileexists() 检查响应。
有什么提示吗?
更新 我想我必须执行如下同步请求,但我总是得到 0x0000000000000000 作为响应::
let urlPath: String = sURL;
var url: NSURL = NSURL(string: urlPath)!
var request1: NSURLRequest = NSURLRequest(URL: url)
var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?
>=nil
var error: NSErrorPointer = nil
var dataVal: NSData = NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)!
var err: NSError
println(response)
检查服务器上是否存在资源需要发送 HTTP 请求和接收响应。 TCP 通信可能需要一些 时间量,例如如果服务器繁忙,则在服务器之间的某个路由器 客户端和服务器不工作 正确,网络中断等
这就是异步请求总是首选的原因。即使你认为 请求只需要几毫秒,有时可能是 秒由于一些网络问题。而且——众所周知——阻塞 主线程 几秒钟是一个很大的禁忌。
综上所述,这是一个可能的实现
fileExists()
方法。你不应该在主线程上使用它,
你已被警告!
HTTP请求方法设置为"HEAD",让服务器发送 只有响应头,没有数据。
func fileExists(url : NSURL!) -> Bool {
let req = NSMutableURLRequest(URL: url)
req.HTTPMethod = "HEAD"
req.timeoutInterval = 1.0 // Adjust to your needs
var response : NSURLResponse?
NSURLConnection.sendSynchronousRequest(req, returningResponse: &response, error: nil)
return ((response as? NSHTTPURLResponse)?.statusCode ?? -1) == 200
}
Swift 3.0 版本的 Martin R 异步编写的答案(主线程未阻塞):
func fileExistsAt(url : URL, completion: @escaping (Bool) -> Void) {
let checkSession = Foundation.URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
request.timeoutInterval = 1.0 // Adjust to your needs
let task = checkSession.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if let httpResp: HTTPURLResponse = response as? HTTPURLResponse {
completion(httpResp.statusCode == 200)
}
})
task.resume()
}