NSData - запись во временный файл / каталог
Я немного растерялся в своем стремлении -
- Скачать CKAsset (PDF-файл)
- Назначить временное имя файла
- Запишите содержимое 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
ссылка не показывает метод с той же сигнатурой, которую вы используете. Попробуйте использовать один из перечисленных в ссылке.