NSData - 写入临时文件/目录
NSData - Write to temporary file / directory
我在寻找-
时有点迷茫
- 下载 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")
}
此版本出现错误 -
Cannot invoke 'writeToFile' with an argument list of type '(URL?,
atomically: Bool, encoding: String.Encoding, error: inout NSError?)'
创建的临时文件将被传递给 UIActivityViewController,用于打印/通过电子邮件发送/空投 PDF,只有一个 CKAsset 名称,UIActivityViewController 无法将文件类型与任何用户安装的应用相关联,保存打印。
您确定您使用的 writeToFile
方法正确吗? NSData
reference 未显示具有您正在使用的相同签名的方法。尝试使用参考中列出的其中一种。
我在Dataclass中只找到了以下函数。
func write(to: URL, options: Data.WritingOptions)
试试这个。
按照上面的指示稍微挠头并检查我的选择后,我改变了策略,实际上并不需要写入文件,只需重命名 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 生成文件名,从而打开对许多其他应用程序的访问。
我在寻找-
时有点迷茫- 下载 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")
}
此版本出现错误 -
Cannot invoke 'writeToFile' with an argument list of type '(URL?, atomically: Bool, encoding: String.Encoding, error: inout NSError?)'
创建的临时文件将被传递给 UIActivityViewController,用于打印/通过电子邮件发送/空投 PDF,只有一个 CKAsset 名称,UIActivityViewController 无法将文件类型与任何用户安装的应用相关联,保存打印。
您确定您使用的 writeToFile
方法正确吗? NSData
reference 未显示具有您正在使用的相同签名的方法。尝试使用参考中列出的其中一种。
我在Dataclass中只找到了以下函数。
func write(to: URL, options: Data.WritingOptions)
试试这个。
按照上面的指示稍微挠头并检查我的选择后,我改变了策略,实际上并不需要写入文件,只需重命名 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 生成文件名,从而打开对许多其他应用程序的访问。