Swift:如何同步下载?

时间:2016-06-22 21:42:22

标签: swift

我正在使用以下代码来下载一些文件:

    let url = NSURL(string:"https://www.example.org/")!
    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
        if error != nil {
            NSLog("%@", "Error: \(error)");
            return
        }

        NSLog("Loaded %i bytes", data!.length)
    }
    task.resume()

我想处理一些文件并在下载后退出我的应用程序。因此,我需要知道下载过程何时完成。最好的方法是,如果有办法同步执行此操作(没问题,如果UI被阻止 - 它只是一个带有进度条的spash屏幕)。但据我在一些研究后对这个主题的理解,这在Swift中是不可能的......

我确实将这段代码包装在一个函数中,因此我不能在NSLog语句之后添加一些代码。我需要知道的是:最后一个文件何时完成下载?我该如何回复这些信息?

编辑:此代码对我有效(但请注意,已弃用!):

    // download file synchonously ////////////////////////////////////////////////////
    func downloadSync(fromURL: String, toPath: String) {
        let request = NSURLRequest(URL: NSURL(string: fromURL)!)
        var response: NSURLResponse?
        do {
            let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response)
            data.writeToFile(toPath, atomically: true)
        } catch {
            print("Error while trying to download following file: " + fromURL)
        }
    }

1 个答案:

答案 0 :(得分:1)

调用task.resume()后,下载开始。

当下载完成(或收到错误)代码时 调用{ }之后的dataTaskWithURL内部。这是一个闭包,它是异步调用的。

let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
    // This code is executed asynchronously after data has been received
}
task.resume()

在关闭内你会得到3个参数:

  1. 数据:您请求的NSData
  2. 回复:整个NSURLResponse
  3. 错误:NSError对象
  4. 这3个值是可选的,因此可以是nil

      

    E.g。可以填充errordata可以是nil

    同步方式[在iOS 9中已弃用]

    此方法已在iOS 9中弃用,您应使用它,但这里是代码

    var response: NSURLResponse?
    var error: NSError?
    let urlData = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response)