尝试归档Codable
元素数组。
do {
let data = try PropertyListEncoder().encode(elements)
let success = NSKeyedArchiver.archiveRootObject(data, toFile:self.archiveURL.path)
print(success ? "Successful save" : "Save Failed")
} catch {
print("Save Failed")
}
由于某种原因,路径(archiveURL
)经常出错:
let archiveURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
总是返回这样的网址:
文件:///用户/用户名/库/开发商/ CoreSimulator /设备/设备ID /数据/文件
但搜索文件夹我看不到 / Documents 文件夹。最近发生了什么变化?它曾经在几周前工作(非常肯定)。超级烦人,我找不到任何解决方法/解决方法。
答案 0 :(得分:3)
在运行iOS 11.x及更高版本的模拟器中会发生这种情况。
在iOS 11之前,模拟器在启动时创建了全局(独立于应用程序)的Documents文件夹。从iOS 11.x开始(不知道它是否是一个特殊的版本),这种情况不再发生了。
请注意NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
仅在(单元)测试中返回此全局文档路径,而不是在运行应用程序时。如果您运行该应用程序,您将获得在模拟器中安装应用程序时仍然创建的特定于应用程序的文档文件夹。
这似乎是Apple方面的一个错误。如果您遇到此问题(如您所见),请在https://developer.apple.com/bug-reporting/提交错误报告。
答案 1 :(得分:2)
我相信这是一个(新的)"功能" iOS模拟器 - 当最初安装应用程序时,不存在所有因果目录。
幸运的是,创建它们很容易,例如对于applicationSupport目录,我在我的应用程序中执行此操作:
let fileManager = FileManager.default
let directory = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first!
if !fileManager.fileExists(atPath: directory) {
try fileManager.createDirectory(atPath: directory, withIntermediateDirectories: true, attributes: nil)
}
答案 2 :(得分:1)
你不能(覆盖)写Documents
目录,你必须附加一个文件名。
为什么要存档数据?您可以将属性列表数据直接写入磁盘。
并且从未在catch
子句中打印无意义的文字字符串,至少打印实际错误。
let fileName = "myPropertyList.plist"
let fileURL = archiveURL.appendingPathComponent(fileName)
do {
let data = try PropertyListEncoder().encode(elements)
try data.write(to: fileURL)
} catch {
print("Save Failed", error)
}