【问题标题】:NSKeyedArchiver.archiveRootObject fails to saveNSKeyedArchiver.archiveRootObject 保存失败
【发布时间】:2018-01-12 00:04:51
【问题描述】:

我有一组要转换为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 目录,这也会失败。

【问题讨论】:

  • 如果将归档步骤和写入步骤一分为二(获取archivedData(withRootObject:),然后将其写出来),错误发生在哪里?应用是否被沙盒化?

标签: swift macos nsarray nsdictionary nskeyedarchiver


【解决方案1】:

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

有关它们的区别的更多详细信息,请参阅answer

【讨论】:

    【解决方案2】:

    试试这个方法保存

    1.方法返回文件路径。

    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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2011-11-17
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多