NSKeyedArchiver.archiveRootObject无法保存

时间:2018-01-12 00:04:51

标签: swift macos nsarray nsdictionary nskeyedarchiver

我有一组自定义对象,我转换为NSMutableDictionary,然后从中创建一个数组(此部分目前正在按预期工作)。

然后我尝试使用NSKeyedArchiver将该数据数据保存为文件。但是,NSKeyedArchiver.archiveRootObject的结果始终返回false

以下是我保存的逻辑 - 我错过了一些明显的东西,或者这可能是错误的做法?谢谢!

    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目录,这也会失败。

2 个答案:

答案 0 :(得分:1)

这里的问题是.absoultestring。如果URL对象包含文件URL,那么我们应该使用.path来处理FileManagerPathUtilities等。因此在这里用.absoultestring替换.path可以解决问题

有关它们之间差异的更多详细信息,请参阅此answer

答案 1 :(得分:0)

尝试此方法保存

1.Method返回文件路径。

func filePath(key:String) -> String {
    let manager = FileManager.default
    let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
    return (url!.appendingPathComponent(key).path)
}

2.使用NSKeyedArchiver保存到文件。

NSKeyedArchiver.archiveRootObject(groupsArray, toFile: filePath(key: "file.archive"))