NSData - запись во временный файл / каталог

Я немного растерялся в своем стремлении -

  1. Скачать CKAsset (PDF-файл)
  2. Назначить временное имя файла
  3. Запишите содержимое CKAsset в имя файла

Мне удалось загрузить CKAsset и отобразить содержимое в UIWebView, однако я спотыкаюсь о шагах 2 и 3, у меня есть имя файла из строки, и, несмотря на попытки различных комбинаций WriteToFile, я получаю ошибки.

Мой код таков:

let filename = record.object(forKey: "materialsFilename")

                        if  materialsType == "PDF" || materialsType == "pdf" {


                            if let asset1 = record.object(forKey: "materialsFile") as? CKAsset {
                                let doc1Data : NSData? = NSData(contentsOf:asset1.fileURL)

                                let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename as! String)


                                let contentsOfFile = doc1Data
                                var error: NSError?

                                // Write File
                                if contentsOfFile.writeToFile(path, atomically: true, encoding: String.Encoding.utf8, error: &error) == false {
                                    if let errorMessage = error {
                                        print("Failed to create file")
                                        print("\(errorMessage)")
                                    }
                                } else {
                                    print("File \(filename) created at tmp directory")
                                }

Эта версия представляет ошибку -

Невозможно вызвать 'writeToFile' со списком аргументов типа '(URL?, атомно: Bool, кодировка: String.Encoding, ошибка: inout NSError?)'

Созданный временный файл будет передан в UIActivityViewController, чтобы распечатать / отправить по электронной почте / передать файл PDF, имеющий только имя CKAsset, UIActivityViewController не может связать тип файла ни с одним из установленных пользователем приложений, сохранить для печати.

3 ответа

Решение

После того, как я немного почесал голову и пересмотрел свой выбор, следуя указанным выше указаниям, я изменил тактику, и мне не нужно было писать в файл, просто переименуйте CKAsset, чего я достиг с помощью следующего скрипта -

let materialsType = record.object(forKey: "materialsType") as! String

                        let filename = record.object(forKey: "materialsFilename") as! String

                        if  materialsType == "PDF" || materialsType == "pdf" {

                            if let asset1 = record.object(forKey: "materialsFile") as? CKAsset {

                                let doc1Data : Data? = Data(contentsOf:asset1.fileURL) as Data?
                                let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)
                                self.materialsWebView.load(doc1Data! as Data, mimeType: "application/pdf", textEncodingName: "UTF-8", baseURL: NSURL() as URL)
                                self.filenameURL = [(fileURL)]
                            }

Ключ, казалось, зависел на двух линиях -

let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)

а также

self.filenameURL = [(fileURL)]

Который генерирует имя файла для UIActivityViewController и, таким образом, открывает доступ к ряду дополнительных приложений.

Я нахожу только следующую функцию в классе данных.

func write(to: URL, options: Data.WritingOptions)

Попробуй это.

Вы уверены, что используете правильный writeToFile метод? NSData ссылка не показывает метод с той же сигнатурой, которую вы используете. Попробуйте использовать один из перечисленных в ссылке.

Другие вопросы по тегам