2015-05-18 21 views
5

ile nasıl dosya bağlantısı kurabilirim Aşağıdaki düğmem bir URL'den dosya indiriyor, İndirme İşlemini göstermek için bir İlerleme Görünümü ile bağlantılandırmam gerekiyor.Bir Progress View

@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") 
       } 
      } 
     } 
    } 

} 

Nasıl Swift bir ilerleme Manzaralı benim indirme ilerleme bağlayabilirsiniz?

cevap

5

İşte size tam çalışma örneğidir: Kimlerin yöntem kullanıcı verilerini indirilirken adı verilecek bunu başarmak için NSURLSessionDownloadDelegate kullanabilirsiniz

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)") 

      } 
     } 

    } 

} 

.

Bu işlem size progressCount etiketinde gösterilecek ve progressBar işlemi, sayı artacak olarak gösterecektir. bunu ihtiyacınıza göre değiştirebilirsiniz.

Bu örnek, HERE adresinden indirebilirsiniz.

+0

Dharmesh Kheni, örnek çalışıyor, ancak dosyanızı nasıl kaydediyorsunuz? –

+0

Güncellenen cevabımı kontrol et. –

+0

Hi @DharmeshKheni. Birden çok URL için nasıl çalışılır. Sadece bunu deniyorum. Yapamadım. Eğer ikinci URL devam ediyorsa, o zaman üçüncü URL araçlarını başlatırsam, 2. durdurulur. Eşzamanlı olarak tüm URL'leri çalıştırmayı bilmiyorum. Hızlı çalışıyorum. Pls bana rehberlik ediyor. –

2

this tutorial'u kontrol edin. Objective-C'de, ancak Swift'e dönüştürmek kolay olacak.

prensibi senin VC bazı NSURLConnectionDataDelegate fonksiyonları uygulamaktır:

  • bağlantısı: didReceiveResponse -> Sen indirilecek dosyanın boyutunu almak ve onunla indirme yüzdesini tahmin edebilir.
  • bağlantı: didReceiveData -> Bu yenileme işlevi, indirme sırasında birden çok kez çağrılacak. Eksik NSData nesnesinin boyutunu, dosyanın boyutuyla karşılaştırabilirsiniz.
  • bağlantıDidFinishLoading -> Bu yöntem indirme işleminin sonunda çağrılır.

Obj-C'yi Swift'e dönüştüren bazı sorunlarınız varsa yorum yapmanıza yardımcı olmadığını ve yorum yapmaktan çekinmeyin.