检查Web服务器上是否存在文件的最简单解决方案。(Swift)
对此有很多讨论,我理解使用委托方法并检查响应“404”的解决方案: 但我希望有一个简单的解决方案,如:检查Web服务器上是否存在文件的最简单解决方案。(Swift),swift,nsurlconnection,Swift,Nsurlconnection,对此有很多讨论,我理解使用委托方法并检查响应“404”的解决方案: 但我希望有一个简单的解决方案,如: var exists:Bool=fileexists(sURL); 因为我将在与委托相同的类中有很多请求,我只想用我的函数fileexists()检查响应 有什么提示吗 更新 我想我必须执行如下同步请求,但我总是得到0x0000000000000000作为响应: let urlPath: String = sURL; var url: NSURL = NSURL(string:
var exists:Bool=fileexists(sURL);
因为我将在与委托相同的类中有很多请求,我只想用我的函数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)
让urlPath:String=sURL;
var url:NSURL=NSURL(字符串:urlPath)!
var request1:NSURLRequest=NSURLRequest(URL:URL)
var响应:AutoreleasingUnsafeMutablePointer=nil
var错误:NSErrorPointer=nil
var dataVal:NSData=NSURLConnection.sendSynchronousRequest(request1,returningResponse:response,error:nil)!
变量错误:n错误
println(响应)
检查服务器上是否存在资源需要发送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版本的答案(主线程未被阻止):
如果您想在Swift中找到一个非常优雅的解决方案,并且不介意学习,请查看关于功能技术的演示,演示者使用了一个与您非常相似的示例。网络请求可能需要很长时间,NSURLConnection的默认超时为30秒。如果你把它包装成一个普通的函数调用,那么它可能会暂时阻止当前线程…谢谢你的帮助。在聚会上我必须登记。我不喜欢在我不知道的网站上注册:-)我想了想。@Martin E.谢谢你的帮助。但是请求只需要几毫秒。下载文件本身时,我必须使用委托来实现这一点,但为了检查文件是否也存在?在Swift 4.0中,可以进行以下小的改进:func fileExistsAt(url:url,completion:@escaping(Bool)->Void){let checkSession=URLSession.shared var request=URLRequest(url:url)request.httpMethod=“HEAD”request.timeoutInterval=1.0//根据需要调整让task=checkSession.dataTask(with:request){(数据、响应、错误)->如果让httpResp=response as?httpurresponse{completion(httpResp.statusCode==200)}则无效task.resume()}这适用于大多数Web服务器,但我有那个URL,如果我检查它,响应总是为零。我试过使用HEAD、GET、POST和TRACE作为HTTPMethod,但仍然是零。如果我删除请求的httpmethodsetter,那么我会得到一个response对象(当然没有重要的状态代码),所以我的问题是如何在这种Web服务器上检查文件?谢谢
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
}
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()
}