Открытие PDF-файла, хранящегося в локальной памяти, в SWIFT PDFView - PullRequest
0 голосов
/ 31 октября 2019

Я загрузил файл PDF в свою кэш-память. Теперь я хочу открыть этот файл PDF в PDFView. Я добавил PDFView в свой ViewController, здесь приведен его код.

let pdfView = PDFView()
override func viewDidLoad() {
   super.viewDidLoad()
   view.addSubview(pdfView)
}

Приведенный ниже код вернет местоположение, в которое PDF был загружен в виде URL-адреса.

guard let pdfURL = downloader.downloadData(urlString: "https://www.tutorialspoint.com/swift/swift_tutorial.pdf", downloadType: DownloadType.cache.rawValue) else { return }

Я проверил возвращенный URL и файл существует. Теперь в следующем коде я пытаюсь открыть его в представлении PDF.

if let document = PDFDocument(url: pdfURL) {
   pdfView.document = document
}

Ниже приведен код, показывающий метод загрузки данных.

public func downloadData(urlString : String,downloadType : String)->URL?{

        let documentsUrl:URL =  FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first as URL!
        var destinationFileUrl = documentsUrl.appendingPathComponent("downloadedFile.pdf")
        try? FileManager.default.removeItem(at: destinationFileUrl)
        guard let url = URL(string: urlString)else{
            return nil
        }
        let urlSession = URLSession(configuration: .default)
        let downloadTask = urlSession.downloadTask(with: url) { (tempLocalUrl, response, error) in
            if let tempLocalUrl = tempLocalUrl, error == nil {

                if let statusCode = (response as? HTTPURLResponse)?.statusCode {
                    print("Successfully downloaded. Status code: \(statusCode)")

                }
                if downloadType == "cache" {
                    do {
                        try? FileManager.default.removeItem(at: destinationFileUrl)
                          try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
                    } catch (let writeError) {
                        print("Error creating a file \(destinationFileUrl) : \(writeError)")
                    }
                }
            } else {
                print("Error took place while downloading a file. Error description: %@", error?.localizedDescription);
            }
        }
        downloadTask.resume()

        return destinationFileUrl
    }

Но похоже, что он возвращаетсяноль и код внутри блока let не выполняется. Пожалуйста, помогите !!

1 Ответ

1 голос
/ 31 октября 2019

ноль конечно. return destinationFileUrl, используйте его для инициализации PDF, получите ноль.

возвращается, пока задача еще выполняется, поэтому файл в пути не существует.

Поскольку загрузка является асинхронным действием.

Итак, завершениеHandler закрывается для.

Обычно, превращайте этот

public func downloadData(urlString : String,downloadType : String)->URL?{

        let documentsUrl:URL =  FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first as URL!
        var destinationFileUrl = documentsUrl.appendingPathComponent("downloadedFile.pdf")
        try? FileManager.default.removeItem(at: destinationFileUrl)
        guard let url = URL(string: urlString)else{
            return nil
        }
        let urlSession = URLSession(configuration: .default)
        let downloadTask = urlSession.downloadTask(with: url) { (tempLocalUrl, response, error) in
            if let tempLocalUrl = tempLocalUrl, error == nil {

                if let statusCode = (response as? HTTPURLResponse)?.statusCode {
                    print("Successfully downloaded. Status code: \(statusCode)")

                }
                if downloadType == "cache" {
                    do {
                        try? FileManager.default.removeItem(at: destinationFileUrl)
                          try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
                    } catch (let writeError) {
                        print("Error creating a file \(destinationFileUrl) : \(writeError)")
                    }
                }
            } else {
                print("Error took place while downloading a file. Error description: %@", error?.localizedDescription);
            }
        }
        downloadTask.resume()


        return destinationFileUrl
    }

в

public func downloadData(urlString : String,downloadType : String, completionHandler: @escaping (URL) -> Void){

            let documentsUrl:URL =  FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first as URL!
            var destinationFileUrl = documentsUrl.appendingPathComponent("downloadedFile.pdf")
            try? FileManager.default.removeItem(at: destinationFileUrl)
            guard let url = URL(string: urlString)else{
                return nil
            }
            let urlSession = URLSession(configuration: .default)
            let downloadTask = urlSession.downloadTask(with: url) { (tempLocalUrl, response, error) in
                if let tempLocalUrl = tempLocalUrl, error == nil {

                    if let statusCode = (response as? HTTPURLResponse)?.statusCode {
                        print("Successfully downloaded. Status code: \(statusCode)")

                    }
                    if downloadType == "cache" {
                        do {
                            try? FileManager.default.removeItem(at: destinationFileUrl)
                              try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
                                completionHandler(destinationFileUrl)
                        } catch (let writeError) {
                            print("Error creating a file \(destinationFileUrl) : \(writeError)")
                        }
                    }
                } else {
                    print("Error took place while downloading a file. Error description: %@", error?.localizedDescription);
                }
            }
            downloadTask.resume()

        }

При обратном вызове завершениеHandler, инициализация PDF

...