使用swift显示从url下载图像的加载百分比
所以我有一个像这样的url下载图像
let request = NSMutableURLRequest(URL: NSURL(string: "\(self.ip)")!) request.HTTPMethod = "POST" let postString = "userID=\(userID)" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) let task = session.dataTaskWithRequest(request) { data, response, error in ......... }
我的代表函数看起来像
func URLSession(session: NSURLSession, task: NSURLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { let uploadProgress:Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend) let progressPercent = Int(uploadProgress*100) print(progressPercent) } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didBecomeDownloadTask downloadTask: NSURLSessionDownloadTask) { let downloadProgress:Float = Float(downloadTask.countOfBytesReceived) / Float(downloadTask.countOfBytesExpectedToReceive) print(downloadProgress) }
上传进度适用于不同的function,但下载图像时,第二个URLSession函数不会被调用。 我究竟做错了什么?
URLSession
有5种类型的委托: URLSessionDelegate
, URLSessionTaskDelegate
, URLSessionDataDelegate
, URLSessionDownloadDelegate
和URLSessionStreamDelegate
。 您可以在文档中阅读它们。
您需要关注的是URLSessionDelegate
和URLSessionDownloadDelegate
:
class ViewController: UIViewController, URLSessionDelegate, URLSessionDownloadDelegate { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var progressView: UIProgressView! private let byteFormatter: ByteCountFormatter = { let formatter = ByteCountFormatter() formatter.allowedUnits = [.useKB, .useMB] return formatter }() override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func downloadImage(sender : AnyObject) { // A 10MB image from NASA let url = URL(string: "http://sofzh.miximages.com/ios/PIA08506.jpg")! let config = URLSessionConfiguration.default let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) // Don't specify a completion handler here or the delegate won't be called session.downloadTask(with: url).resume() } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { let written = byteFormatter.string(fromByteCount: totalBytesWritten) let expected = byteFormatter.string(fromByteCount: totalBytesExpectedToWrite) print("Downloaded \(written) / \(expected)") DispatchQueue.main.async { self.progressView.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite) } } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { // The location is only temporary. You need to read it or copy it to your container before // exiting this function. UIImage(contentsOfFile: ) seems to load the image lazily. NSData // does it right away. if let data = try? Data(contentsOf: location), let image = UIImage(data: data) { DispatchQueue.main.async { self.imageView.contentMode = .scaleAspectFit self.imageView.clipsToBounds = true self.imageView.image = image } } else { fatalError("Cannot load the image") } } }