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

时间:2015-05-18 05:39:32

标签: ios iphone xcode swift uiprogressview

我的按钮代码从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中的进度视图相关联?

2 个答案:

答案 0 :(得分:6)

以下是完整的工作示例:

body

您可以使用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://www.qdtricks.com/wp-content/uploads/2015/02/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将显示进程,因为计数将递增。你可以根据需要修改它。

您可以从HERE下载此示例。

答案 1 :(得分:2)

检查here。它位于Objective-C中,但很容易转换为Swift。

原则是在VC上实现一些Separator函数:

  • connection:didReceiveResponse - >您可以检索将要下载的文件的大小,并使用它来估计下载百分比。
  • connection:didReceiveData - >它是刷新功能,在下载过程中会多次调用。您可以将不完整的NSData对象的大小与文件的大小进行比较。
  • connectionDidFinishLoading - >在下载过程结束时调用此方法。

希望它有所帮助,如果您在将Obj-C转换为Swift时遇到麻烦,请不要犹豫。