最简单的解决方案,用于检查Web服务器上是否存在文件。 (迅速)

时间:2015-06-05 06:36:06

标签: swift nsurlconnection

关于此问题有很多讨论,我理解使用委托方法并检查响应的解决方案" 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);

因为我在代理的同一个类中会有很多请求,我只想用我的函数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)

2 个答案:

答案 0 :(得分:6)

检查服务器上是否存在资源需要发送HTTP 请求并收到回复。 TCP通信可能需要一些 时间量,例如如果服务器忙,一些路由器之间 客户端和服务器不起作用 正确地说,网络已经关闭等等。

这就是为什么异步请求总是首选的原因。即使你认为 请求应该只需要几毫秒,有时可能是 由于某些网络问题导致的秒数。并且 - 我们都知道 - 阻止 主线程几秒钟是一个很大的禁忌。

所有这一切,这里是一个可能的实现 fileExists()方法。你不应该在主线程上使用它, 你被警告了!

HTTP请求方法设置为&#34; HEAD&#34;,以便服务器发送 只有响应头,但没有数据。

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
}

答案 1 :(得分:6)

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