我正在使用以下代码来下载一些文件:
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)
}
}
答案 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个参数:
NSData
NSURLResponse
NSError
对象这3个值是可选的,因此可以是nil
。
E.g。可以填充
error
,data
可以是nil
。
此方法已在iOS 9中弃用,您应不使用它,但这里是代码
var response: NSURLResponse?
var error: NSError?
let urlData = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response)