将进度条添加到下载文件[重复]

     2023-03-16     27

关键词:

【中文标题】将进度条添加到下载文件[重复]【英文标题】:Add progress-bar to Download file [duplicate] 【发布时间】:2018-07-24 22:06:42 【问题描述】:

我正在实现一个 ViewController 来显示以前从我的服务器下载并存储在设备本地的 PDF,它可以正常工作,但是下载 PDF 需要太多时间,我想实现一个 progress-bar

我的代码如下,我尝试在其中实现 @IBOutlet weak var downloadBar: UIProgressView!当我得到下载所需的时间,所以我吃我的代码达到 100% 并且下载还没有结束。

class PDFViewController: UIViewController 
    @IBOutlet weak var pdfView: PDFView!

    @IBOutlet weak var downloadBar: UIProgressView!

    //*******
    var downloader = Timer()
    var minValue = 0
    var maxValue = 100
    //********

    var namePDF:String?

    override func viewDidLoad() 
        super.viewDidLoad()

        downloadBar.setProgress(0, animated: false)


        if let pdfUrl = URL(string: "https://miserver.com/\(namePDF!).pdf") 


            print(pdfUrl)

            // then lets create your document folder url
            let documentsDirectoryURL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

            // lets create your destination file url
            let destinationUrl = documentsDirectoryURL.appendingPathComponent(pdfUrl.lastPathComponent)
            print(destinationUrl)

            // to check if it exists before downloading it
            if FileManager.default.fileExists(atPath: destinationUrl.path) 
                print("The file already exists at path")

                /************** show pdf ****************/
                let pdfUrl = destinationUrl.path
                let rutafile = URL(fileURLWithPath: pdfUrl)
                print(pdfUrl)
                if let document = PDFDocument(url: rutafile) 
                    pdfView.autoScales = true
                    pdfView.document = document
                
                 /************** end show pdf ****************/


                // if the file doesn't exist
             else 
                 print("file doesn't exist")

                downloader = Timer.scheduledTimer(timeInterval: 0.06, target: self, selector: (#selector(PDFViewController.updater)), userInfo: nil, repeats: true)
                downloadBar.setProgress(0, animated: false)

                // you can use NSURLSession.sharedSession to download the data asynchronously
                URLSession.shared.downloadTask(with: pdfUrl, completionHandler:  (location, response, error) -> Void in
                    guard let location = location, error == nil else  return 
                    do 
                        // after downloading your file you need to move it to your destination url
                        try FileManager.default.moveItem(at: location, to: destinationUrl)
                        print("File moved to documents folder")

                        print("file has already been downloaded")
                        /************** show pdf ****************/
                        let pdfUrl = destinationUrl.path
                        let rutafile = URL(fileURLWithPath: pdfUrl)
                        print(pdfUrl)
                        if let document = PDFDocument(url: rutafile) 
                            self.pdfView.autoScales = true
                            self.pdfView.document = document
                        
                        /************** show pdf ****************/

                     catch let error as NSError 
                        print(error.localizedDescription)
                    
                ).resume()
            
        



    

@objc func updater() 

    if minValue != maxValue 
        minValue += 1
        downloadBar.progress = Float(minValue) / Float(maxValue)

        print(Float(minValue) / Float(maxValue))
     else 
        minValue = 0
        downloader.invalidate()
    

已经非常感谢你了

【问题讨论】:

你为什么使用定时器? var 下载器 = Timer().您是否还面临 IBOutlet 的问题或没有显示进度? 当您想显示进度时,为shared 调用downloadTask(with:completionHandler:) 并不是最好的方法。创建一个配置了委托的URLSession,并正确准备委托方法,然后将downloadTask(with:)用于创建的实例。我没有足够的时间来写答案,希望您能尽快找到正确的方向。 @Asim Progress 如果显示(进度条有效),但我的问题是它在没有完成下载文件的情况下达到 100 的时间。如何获得下载所需的时间? ***.com/q/30047706/2303865 【参考方案1】:

您可以实现 URLSessionDownloadDelegate 协议。然后使用以下方法:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) 
    if totalBytesExpectedToWrite > 0 
        let progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)

        self.downloadBar.setProgress(progress, animated: false)
    

这只会在写入新字节时更新进度条。并准确估计您的下载进度。希望这会有所帮助:)

【讨论】:

如何使用这个 URLSessionDownoadDelegate 协议?我的意思是哪个类应该符合它?能详细回答一下吗? 只需将协议与您从中调用它的类保持一致,例如您要更新进度的相应 ViewController。并听听上述功能的进展情况。每次取得进度时都会调用该函数,您可以将更新的进度分配给进度条。

使用Objective-c中的进度条将文件从一个地方复制到另一个地方[重复]

】使用Objective-c中的进度条将文件从一个地方复制到另一个地方[重复]【英文标题】:CopyfilefromoneplacetoanotherusingprogressbarinObjective-c[duplicate]【发布时间】:2013-05-0518:37:46【问题描述】:当我将文件从一个地方复制到另一个地方时... 查看详情

将进度条添加到wininet http上传C++

】将进度条添加到wininethttp上传C++【英文标题】:AddingprogressbartowininethttpuploadC++【发布时间】:2017-06-2304:14:55【问题描述】:我正在使用POST方法在HTTP服务器上上传二进制文件的代码:http_upload_file(PCHARszServer,PCHARszScript,PCHARszParam,P... 查看详情

数据导出进度条

...下的存贮位置,开启一个新的线程。将数据组装进程(的进度)写入redis缓存,通过定时任务不断从缓存中读取数据,页面展现为下载的进度条。3.下载B文件到本地(本地路径);( 查看详情

如何将进度条控件添加到 Matlab gui?

】如何将进度条控件添加到Matlabgui?【英文标题】:HowtoaddprogressbarcontroltoMatlabgui?【发布时间】:2011-07-1903:19:59【问题描述】:有没有现成的进度条uicontrol可以添加到matlabgui中,uicontrol还是ActiveX组件?[edit]我知道waitbar功能,我... 查看详情

图片下载进度条

】图片下载进度条【英文标题】:progressbarwhendownloadingimage【发布时间】:2010-06-2419:10:56【问题描述】:我将如何添加一个进度条来下载大图像或任何文件?这是我的代码:NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUs... 查看详情

AsyncTask 和进度条 [重复]

】AsyncTask和进度条[重复]【英文标题】:AsyncTaskandProgressBar[duplicate]【发布时间】:2014-02-0521:14:51【问题描述】:我有发送(多个文本文件)到服务器的应用程序,每个文件发送和获取响应都会更新进度条。一旦所有文件都发送完... 查看详情

将文本格式化到 Tkinter 进度条

】将文本格式化到Tkinter进度条【英文标题】:FormattingTexttotheTkinterProgressbar【发布时间】:2022-01-1910:22:30【问题描述】:我知道根据这个问题将文本添加到进度条:Displayingpercentageinttkprogressbar这对我有帮助,但我需要对答案进行... 查看详情

将加载指示器/进度条添加到 Phonegap Android 闪屏

】将加载指示器/进度条添加到PhonegapAndroid闪屏【英文标题】:Addloadingindicator/progressbartoPhonegapAndroidsplashscreen【发布时间】:2012-03-1219:02:39【问题描述】:我有一个PhoneGap1.4.1/jQueryMobile1.0.1/Android项目,它可以很好地显示res/drawable/s... 查看详情

为多个文件下载添加子进度

】为多个文件下载添加子进度【英文标题】:Addingchildprogressformultiplefiledownload【发布时间】:2016-02-0704:47:51【问题描述】:我正在我的项目中使用AFNetworking3.0下载多个文件。我想显示所有文件的单个下载进度。我将每个文件下载... 查看详情

显示下载进度条

】显示下载进度条【英文标题】:showdownloadprogressbar【发布时间】:2021-10-2604:24:50【问题描述】:在我的应用程序中,我使用执行器服务从url下载文件。现在我想添加一个水平进度条来显示下载进度。但我面临错误。如何在不使... 查看详情

下载文件时进度条不显示剩余百分比?

】下载文件时进度条不显示剩余百分比?【英文标题】:progressbarnotshowremainingbypercentwhendownloadfile?【发布时间】:2021-10-2819:28:21【问题描述】:我在Angular8上工作,我遇到问题进度条不显示部分下载假设我下载数据然后20%然后40%... 查看详情

vc下载文件+显示进度条

在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释: 1、下载线程函数: [cpp] viewplain copy  print?UINT DownloadFile(LPVOID pParam)  {    & 查看详情

文件上传进度条[重复]

】文件上传进度条[重复]【英文标题】:Fileuploadprogressbar[duplicate]【发布时间】:2011-04-0611:20:21【问题描述】:可能重复:UploadProgressBarinPHP任何人都可以建议一种在上传文件时包含文件上传进度条的好方法。我知道这将是javascript... 查看详情

NSURLSession 下载任务 - 进度条问题

】NSURLSession下载任务-进度条问题【英文标题】:NSURLSessionDownloadTask-ProgressBarIssue【发布时间】:2016-05-0406:14:40【问题描述】:我正在处理一个非ARC项目,我必须在其中下载视频,下载后我将显示它们。我正在使用NSURLSession下载它... 查看详情

将滚动条添加到 <textarea> [重复]

】将滚动条添加到<textarea>[重复]【英文标题】:Addascrollbartoa<textarea>[duplicate]【发布时间】:2013-10-2514:25:15【问题描述】:我想在textarea中添加一个滚动条,以便它始终显示,即使没有可向下滚动的内容。如果没有可以向... 查看详情

pythonhttp下载文件并显示下载进度条

...t下载文件并写入到文件系统,利用progressbar模块显示下载进度条。其中利用request模块下载文件可以直接下载,不需要使用open方法,例如:import urllibimport requests.packages.urllib3requests.packages.urllib3.disable_warnings()url&n 查看详情

下载大文件时在进度条上设置百分比不在 0 到 100 之间

】下载大文件时在进度条上设置百分比不在0到100之间【英文标题】:SetPercentagenotbetween0and100atProgressbarwhiledownloadinglargefiles【发布时间】:2019-05-2720:54:43【问题描述】:当我下载小.png文件时,我正在尝试从服务器下载文件,但在... 查看详情

添加视图时进度条没有动画

】添加视图时进度条没有动画【英文标题】:progressbarnotanimatedwhenviewsareadded【发布时间】:2018-04-2311:51:21【问题描述】:当我将动态图像视图添加到我的表行时,我的进度条没有动画我的xml如下所示:<RelativeLayoutxmlns:android="htt... 查看详情