Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查Web服务器上是否存在文件的最简单解决方案。(Swift)_Swift_Nsurlconnection - Fatal编程技术网

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

检查Web服务器上是否存在文件的最简单解决方案。(Swift),swift,nsurlconnection,Swift,Nsurlconnection,对此有很多讨论,我理解使用委托方法并检查响应“404”的解决方案: 但我希望有一个简单的解决方案,如: var exists:Bool=fileexists(sURL); 因为我将在与委托相同的类中有很多请求,我只想用我的函数fileexists()检查响应 有什么提示吗 更新 我想我必须执行如下同步请求,但我总是得到0x0000000000000000作为响应: let urlPath: String = sURL; var url: NSURL = NSURL(string:

对此有很多讨论,我理解使用委托方法并检查响应“404”的解决方案:

但我希望有一个简单的解决方案,如:

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