的NSData - 写入临时文件/目录

问题描述:

我有点失去了我的追求 -的NSData - 写入临时文件/目录

  1. 下载CKAsset(PDF文件)
  2. 分配一个临时文件名
  3. 写CKAsset的内容在文件名

我已成功地下载CKAsset和显示内容在一个UIWebView,但我绊倒步骤2和3,我有一个字符串的文件名,尽管尝试各种令状eToFile组合我收到错误。

我的代码是这样的:

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") 
           } 

这个版本介绍错误 -

Cannot invoke 'writeToFile' with an argument list of type '(URL?, atomically: Bool, encoding: String.Encoding, error: inout NSError?)'

一旦创建将被传递到UIActivityViewController,临时文件打印/邮件/空投的PDF,只有CKAsset名称,UIActivityViewController无法将文件类型与任何用户安装的应用程序相关联,以供打印。

+0

你能在“contentsOfFile.writeToFile”之前设置一个断点吗? - >“路径”有什么价值。如果它为空,它将无法写入特定文件。也许te文件名不知何故?另一个选项:在最后设置断点。 “错误”包含什么? – Lepidopteron

+0

在该阶段的路径似乎是CKAsset路径 - 路径=〜/库/缓存/ CloudKit/48e71b0c5ca5e4eb9add0599a376bae1d958ed3e /资产/ 40118308-8136-4A66-8321-66AD609798A6.01707e7ffadfd047f02bc4a1579e6bcd2dbadf2c0b,大小= 268270,UUID = 40118308-8136 -4A66-8321-66AD609798A6,签名= Bowcaps

+0

您被允许写入云/使用用户的iCloud吗? – Lepidopteron

有点挠头和审查我的选择按照上述指针后,我改变了方向,并没有真正需要写文件,只需重命名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生成文件名,从而打开对许多其他应用程序的访问。

您确定您使用的是正确的writeToFile方法吗? NSDatareference不显示您使用相同签名的方法。尝试使用参考文献中列出的之一。

我只在Data类中找到以下函数。

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

试试这个。

+0

我建议你在Swift 3中使用Data而不是NSData。 – Lumialxk