在 UITableviewCell 中显示下载进度
Posted
技术标签:
【中文标题】在 UITableviewCell 中显示下载进度【英文标题】:Show download progress in UITableviewCell 【发布时间】:2018-01-04 11:57:19 【问题描述】:我是 ios 开发人员。我想实现这样的功能,在 UITableview 中显示多个文件,带有文件名、UIProgressView 和下载按钮。我想实现 如果用户单击下载按钮然后开始下载文件更新该单元格的 UIProgressView 值,如果我单击另一个单元格的下载按钮,那么这两个文件应该与下载状态同时下载。如果有人知道,请帮助我。这是我的代码
import UIKit
class PDFCell: UITableViewCell,URLSessionTaskDelegate,URLSessionDownloadDelegate
@IBOutlet weak var btnStartDownload: UIButton!
@IBOutlet weak var downloadProgress: UIProgressView!
var url:String?
var percentageWritten: Float = 0.0
var taskTotalBytesWritten = 0
var taskTotalBytesExpectedToWrite = 0
var task: URLSessionTask!
let config = URLSessionConfiguration.background(withIdentifier: "lanet.PDFDownload")
lazy var session: URLSession =
URLSession(configuration: config, delegate: self as! URLSessionDelegate, delegateQueue: OperationQueue())
()
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)
if totalBytesExpectedToWrite > 0
let progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
DispatchQueue.main.async
self.downloadProgress.progress = progress
debugPrint("Progress \(downloadTask) \(progress)")
override func prepareForReuse()
super.prepareForReuse()
self.url = ""
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let documentDirectoryPath:String = path[0]
let fileManager = FileManager()
let destinationURLForFile = URL(fileURLWithPath: documentDirectoryPath.appendingFormat("/file.pdf"))
if fileManager.fileExists(atPath: destinationURLForFile.path)
// showFileWithPath(path: destinationURLForFile.path)
else
do
try fileManager.moveItem(at: location, to: destinationURLForFile)
// show file
// showFileWithPath(path: destinationURLForFile.path)
catch
print("An error occurred while moving file to destination url")
debugPrint("Download finished: \(location)")
try? FileManager.default.removeItem(at: location)
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
debugPrint("Task completed: \(task), error: \(error)")
override func awakeFromNib()
super.awakeFromNib()
// Initialization code
override func setSelected(_ selected: Bool, animated: Bool)
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
@IBAction func btnDownloadClick(_ sender: Any)
let url = URL(string: self.url!)!
let task = session.downloadTask(with: url)
task.resume()
【问题讨论】:
你现在的代码到底有什么问题? 如果我第一次单击任何单元格,它对该单元格工作正常。但第二次如果我单击任何单元格,它将显示先前选择的单元格的进度(第一次选择的单元格) 这里有一个完整的演示raywenderlich.com/158106/urlsession-tutorial-getting-started 强烈建议您不要在视图(单元格)中运行与 URLSession 相关的代码。考虑到可以立即释放单元格,并且下载将进入未定义状态。此代码应该在控制器、模型或单独的下载管理器中执行。 UI 可以通过回调闭包持续更新。 @Ankit Prajapati 你能解决吗?我也有同样的问题,如果你愿意分享你的参考代码的话。 【参考方案1】:阅读本教程以获得基本参考:https://www.raywenderlich.com/158106/urlsession-tutorial-getting-started
在部分下载进度中你会看到
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64, totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64)
// 1
guard let url = downloadTask.originalRequest?.url,
let download = downloadService.activeDownloads[url] else return
// 2
download.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
// 3
let totalSize = ByteCountFormatter.string(fromByteCount: totalBytesExpectedToWrite, countStyle: .file)
// 4
DispatchQueue.main.async
if let trackCell = self.tableView.cellForRow(at: IndexPath(row: download.track.index,
section: 0)) as? TrackCell
trackCell.updateDisplay(progress: download.progress, totalSize: totalSize)
【讨论】:
以上是关于在 UITableviewCell 中显示下载进度的主要内容,如果未能解决你的问题,请参考以下文章
从多个部分 UITableView 中的 UITableViewCell 获取 IndexPath 以响应通知
使用 Alamofire 下载图像并在 UITableViewCell 中显示