NSData - 写入临时文件/目录
Posted
技术标签:
【中文标题】NSData - 写入临时文件/目录【英文标题】:NSData - Write to temporary file / directory 【发布时间】:2017-04-05 09:55:38 【问题描述】:我有点迷失了——
-
下载 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")
此版本出现错误 -
不能使用类型为 '(URL?, 原子:Bool,编码:String.Encoding,错误:inout NSError?)'
一旦创建的临时文件将被传递给 UIActivityViewController,以打印/电子邮件/空投 PDF,只有 CKAsset 名称,UIActivityViewController 无法将文件类型与任何用户安装的应用程序相关联,保存以供打印。
【问题讨论】:
能否在“contentsOfFile.writeToFile”之前设置断点? -> “路径”有什么价值。如果为空,则无法写入特定文件。也许 te 文件名是错误的?另一个选项:在末尾设置断点。 “错误”包含什么? 在该阶段的路径似乎是CKAsset路径 - 路径=〜/库/缓存/ CloudKit / 48e71b0c5ca5e4eb9add0599a376bae1d958ed3e /资产/ 40118308-8136-4A66-8321-66AD609798A6.01707e7ffadfd047f02bc4a1579e6bcd2dbadf2c0b,大小= 268270, UUID=40118308-8136-4A66-8321-66AD609798A6,签名= 是否允许写入云端/使用用户的 iCloud? 【参考方案1】:在摸索了一下并按照上面的指示检查了我的选择之后,我改变了策略,并不真的需要写入文件,只需重命名 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 生成文件名,从而打开对许多其他应用程序的访问。
【讨论】:
【参考方案2】:您确定您使用的是正确的writeToFile
方法吗? NSData
reference 没有显示与您使用的签名相同的方法。尝试使用参考中列出的其中一种。
【讨论】:
【参考方案3】:我只在Data类中找到以下函数。
func write(to: URL, options: Data.WritingOptions)
试试这个。
【讨论】:
我建议你在 Swift 3 中使用 Data 而不是 NSData。以上是关于NSData - 写入临时文件/目录的主要内容,如果未能解决你的问题,请参考以下文章