热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何将Firebase下载文件与进度视图相关联?-HowtolinkFirebasedownloadfilewithaprogressview?

BelowisthecodeIamusingtodownloadPDFfilesfromFirebasestorage.以下是我用于从Firebase存储下载PDF文件的代

Below is the code I am using to download PDF files from Firebase storage.

以下是我用于从Firebase存储下载PDF文件的代码。

What I want to do is to link it with a download progress view with percentage instead of activity indicator.

我想要做的是将其与包含百分比而非活动指示符的下载进度视图链接。

import Foundation
import UIKit
import Firebase
import SwiftLoader


class showPdfVC: UIViewController , UIWebViewDelegate,ReaderViewControllerDelegate{


var pdfbooks = UIWebView()

var nIndex:NSInteger!
var post: Post!
var db : DBHelper = DBHelper()
var book : BookModel?


@IBAction func backbtn(_ sender: Any) {

    if let navCOntroller= self.navigationController {
        navController.popViewController(animated: true)
    }
}


override func viewDidLoad() {
    super.viewDidLoad()

    var config : SwiftLoader.COnfig= SwiftLoader.Config()
    config.size = 150
    config.spinnerColor = .brown
    config.foregroundColor = .black
    config.foregroundAlpha = 0.5
    config.titleTextColor = .brown


    SwiftLoader.setConfig(config)


    if "" !=  book?.bookPath {
     //   self.activityIND.isHidden = true
      //  self.activityIND.stopAnimating()
        UIApplication.shared.isNetworkActivityIndicatorVisible = false

        SwiftLoader.hide()

        loadReader(filePaht: (book?.bookPath)!)
    } else {

        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let strName = book?.id
        let filePath = "\(documentsPath)/"+strName!+".pdf"
        let fileManager = FileManager.default
      //  self.activityIND.startAnimating()
         SwiftLoader.show(title: "Loading...", animated: true)
        UIApplication.shared.isNetworkActivityIndicatorVisible = true

        if fileManager.fileExists(atPath: filePath) {
        //    self.loadFromUrl(path: filePath)
            loadReader(filePaht: (book?.bookPath)!)
            return;
        }


        let reference = FIRStorage.storage().reference(forURL: (self.book?.bookURL)!)
        reference.data(withMaxSize: 50 * 1024 * 1024) { (data, error) -> Void in
            if (error != nil) {

                print ("unable to download pdf file from Firebase Storage")

            //    self.activityIND.isHidden = false
           //     self.activityIND.startAnimating()
                 SwiftLoader.show(title: "Loading...", animated: true)
                UIApplication.shared.isNetworkActivityIndicatorVisible = true

            } else {

                if ((try! data?.write(to: URL.init(fileURLWithPath: filePath, isDirectory: false))) != nil) {
             //       self.loadFromUrl(path: filePath)
                    print ("pdf file is downloaded from Firebase Storage")
                    self.db.upDate(id: (self.book?.id)!, bookPath: filePath)
                 //   self.activityIND.isHidden = true

                    SwiftLoader.hide()
                    self.loadReader(filePaht: filePath)

                    UIApplication.shared.isNetworkActivityIndicatorVisible = false



              }
            }
        }

    }
}


func loadReader(filePaht : String)  {

    let document = ReaderDocument(filePath: filePaht, password: nil)
    if document != nil {
        let readerVC = ReaderViewController(readerDocument: document)
        readerVC?.delegate = self
        readerVC?.modalTransitiOnStyle= UIModalTransitionStyle.crossDissolve
        readerVC?.modalPresentatiOnStyle= UIModalPresentationStyle.fullScreen
        self.navigationController?.pushViewController(readerVC!, animated: true)
    }

}

func dismiss(_ viewController: ReaderViewController!) {

   _ = self.navigationController?.popToRootViewController(animated: true)
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

1 个解决方案

#1


2  

Several thoughts:

几点想法:

  • Don't download in memory and then write to disk--we have a method that downloads straight to the file system
  • 不要在内存中下载然后写入磁盘 - 我们有一个直接下载到文件系统的方法
  • Attach listeners rather than a single completion handler--that way you can listen to progress updates
  • 附加侦听器而不是单个完成处理程序 - 这样您就可以监听进度更新
  • Use something like MBProgressHUD to show an incremental progress bar
  • 使用类似MBProgressHUD的内容来显示增量进度条
  • No need to set the isNetworkActivityIndicatorVisible as we'll do that for you
  • 不需要设置isNetworkActivityIndi​​catorVisible,因为我们会为您执行此操作

Putting that together, you get something like:

把它们放在一起,就会得到类似的东西:

// Create a reference to the file we want to download
let starsRef = storageRef.child("images/stars.jpg")

// Start the download (in this case writing to a file)
let downloadTask = storageRef.write(toFile: localURL)

// Start progress indicator

// Observe changes in status
downloadTask.observe(.progress) { snapshot in
  // Download reported progress
  let percentComplete = 100.0 * Double(snapshot.progress!.completedUnitCount)
    / Double(snapshot.progress!.totalUnitCount)
  // Update the progress indicator
}

downloadTask.observe(.success) { snapshot in
  // Download completed successfully
  // Stop progress indicator
}

// Errors only occur in the "Failure" case
downloadTask.observe(.failure) { snapshot in
  // An error occurred!
  // Stop progress indicator
}

推荐阅读
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
sdfsfsd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有