有没有特定的方法来收听 PDFDocument 或 PDFView url 加载的完成情况?

Posted

技术标签:

【中文标题】有没有特定的方法来收听 PDFDocument 或 PDFView url 加载的完成情况?【英文标题】:Is there a specific way to listen to the completion of PDFDocument or PDFView url load? 【发布时间】:2018-05-25 10:30:39 【问题描述】:

我已经实现了一个自定义 PDFView,它可以从云端和本地加载 pdf 文件(如果有)。对于本地实例,一切都按预期快速加载,但是当 url 不是本地的,即来自服务器时可能需要一段时间,我想在 PDFView 加载文件时添加一个 UIActivityIndi​​cator,有没有办法让我们知道像要收听以跟踪此情况的委托或通知?

我的实现基本如下:

let url = ReportsRepository.shared.getReportUrl(id: "1234")

self.pdfView.document = PDFDocument(url: url)

在此之后,如果 URL 来自服务器应用程序似乎冻结,所以我需要在这里添加一个 UIActivityIndi​​cator,问题是如何使用 PDFKit 停止它?

【问题讨论】:

***.com/q/5549369/2515456的可能重复 @KarthickRamesh 请再次检查它是否重复。试试他在寻找什么。 在询问之前我已经在 stackover flow 中搜索过,我确保没有重复:P 【参考方案1】:

我已经使用后台队列了。这是我的代码。

//Some loading view here
    DispatchQueue.global(qos: .background).async 

        if let url = URL(string: self.selectedWebUrl) 
            if let pdfDocument = PDFDocument(url: url) 
                DispatchQueue.main.async 
                   //Load document and remove loading view
                    self.pdfView.displayMode = .singlePageContinuous
                    self.pdfView.autoScales = true
                    self.pdfView.displayDirection = .vertical
                    self.pdfView.document = pdfDocument

                
             else 
                DispatchQueue.main.async 
                    //not able to load document from pdf
                    //Remove loading view

                
            
         else 
            DispatchQueue.main.async 
                //Wrong Url show alert or something
                //Remove loading view

            
        
    

【讨论】:

【参考方案2】:

另一种加载PDFDocument 的方法是传入原始数据。

如果这是我的问题,我会通过这样的方法异步加载数据:

func loadAndDisplayPDF() 

    // file on the local file system
    let requestURL = URL(fileURLWithPath: "/tmp/MyResume.pdf")! 

    // remote pdf
    //let requestURL = URL(string: "http://www-personal.umich.edu/~myke/MichaelDautermannResume.pdf")!
    let urlRequest = URLRequest(url: requestURL)
    let session = URLSession.shared

    if requestURL.isFileURL == false 
        print("this is a good place to bring up a UIActivityIndicator")
    
    let task = session.dataTask(with: urlRequest) 
        (data, response, error) -> Void in

        if let actualError = error
        
            print("loading from \(requestURL.absoluteString) - some kind of error \(actualError.localizedDescription)")
        

        if let httpResponse = response as? HTTPURLResponse
        
            let statusCode = httpResponse.statusCode

            if (statusCode == 200) 
                print("file downloaded successfully.")
             else  
                print("Failed")
            
        

        if let actualData = data 
            print("data length is \(actualData.count)")
            self.pdfView = PDFView(frame: CGRect(x: 10, y: 10, width: 200, height: 200))
            if let actualPDFView = self.pdfView 
                actualPDFView.document = PDFDocument(data: actualData)
                self.view = actualPDFView
            
        
        print("all done")
    
    task.resume()

您可以立即显示 UIActivityIndi​​cator(当您检测到它是远程的时),或者您可以设置一个计时器以在 1/2 - 1 秒后触发,在 PDF 文件即将显示时使两者无效和/删除。

【讨论】:

这似乎是合理的,我还没有尝试过,但它是有道理的。当我有机会进行测试时,我会通知你。

以上是关于有没有特定的方法来收听 PDFDocument 或 PDFView url 加载的完成情况?的主要内容,如果未能解决你的问题,请参考以下文章

如何跟踪用户收听特定播客的时间

如何在实时代码应用程序中的Mac OS X上收听特定的文本字符串

Discord 如何连接到特定进程的音频?

Back And:如何只收听和 emmett 对特定项目的实时更改?

如何将 List<PdfDocument> 合并为单个 PdfDocument

从 macOS 应用程序打印 PDF - 将上下文定义为 PDFDocument