NSKeyedArchiver.archiveRootObject 保存失败
NSKeyedArchiver.archiveRootObject fails to save
我有一组自定义对象,我正在将其转换为 NSMutableDictionary
,然后从中创建一个数组(这部分目前正在按预期工作)。
然后我尝试使用 NSKeyedArchiver
将该数据数组保存为文件。但是,NSKeyedArchiver.archiveRootObject
的结果总是returnsfalse
。
以下是我的保存逻辑 - 我是否遗漏了一些明显的东西,或者这是错误的方法?谢谢!
var groupsArray = [Any?]()
for group in file!.groups{
for obj in group.children {
let objDict = obj.convertToDictionary()
groupsArray.append(objDict)
}
}
let documents: String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let filePath: String = URL(fileURLWithPath: documents).appendingPathComponent("file.archive").absoluteString
let save: Bool = NSKeyedArchiver.archiveRootObject(groupsArray, toFile: filePath)
编辑:如果尝试保存到 .desktop
或 .caches
目录,这也会失败。
试试这个方法来保存
1.Method returns 文件路径。
func filePath(key:String) -> String {
let manager = FileManager.default
let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
return (url!.appendingPathComponent(key).path)
}
2.Code 使用 NSKeyedArchiver 保存到文件。
NSKeyedArchiver.archiveRootObject(groupsArray, toFile: filePath(key: "file.archive"))
这里的问题是.absoultestring
。如果 URL 对象包含文件 URL,那么我们应该使用 .path
来处理 FileManager
或 PathUtilities
等。所以这里替换 .absoultestring
.path
将解决问题
有关它们的更多详细信息,请参阅此answer
我有一组自定义对象,我正在将其转换为 NSMutableDictionary
,然后从中创建一个数组(这部分目前正在按预期工作)。
然后我尝试使用 NSKeyedArchiver
将该数据数组保存为文件。但是,NSKeyedArchiver.archiveRootObject
的结果总是returnsfalse
。
以下是我的保存逻辑 - 我是否遗漏了一些明显的东西,或者这是错误的方法?谢谢!
var groupsArray = [Any?]()
for group in file!.groups{
for obj in group.children {
let objDict = obj.convertToDictionary()
groupsArray.append(objDict)
}
}
let documents: String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let filePath: String = URL(fileURLWithPath: documents).appendingPathComponent("file.archive").absoluteString
let save: Bool = NSKeyedArchiver.archiveRootObject(groupsArray, toFile: filePath)
编辑:如果尝试保存到 .desktop
或 .caches
目录,这也会失败。
试试这个方法来保存
1.Method returns 文件路径。
func filePath(key:String) -> String {
let manager = FileManager.default
let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
return (url!.appendingPathComponent(key).path)
}
2.Code 使用 NSKeyedArchiver 保存到文件。
NSKeyedArchiver.archiveRootObject(groupsArray, toFile: filePath(key: "file.archive"))
这里的问题是.absoultestring
。如果 URL 对象包含文件 URL,那么我们应该使用 .path
来处理 FileManager
或 PathUtilities
等。所以这里替换 .absoultestring
.path
将解决问题
有关它们的更多详细信息,请参阅此answer