swift 3 : [String: AnyObject] using NSCoding protocol to save with NSUserDefaults

标签 swift nsuserdefaults nscoding

我有我的自定义类:

private class PendingRequest : NSObject, NSCoding
{
    var route : String!
    var params: [String: AnyObject]!

    init(route: String, params: [String: AnyObject])
    {
        self.route = route
        self.params = params
    }
    required init(coder aDecoder: NSCoder)
    {
        self.route = aDecoder.decodeObject(forKey: "route") as! String
        self.params = aDecoder.decodeObject(forKey: "params") as! [String: AnyObject]
    }

    public func encode(with coder: NSCoder)
    {
        coder.encode(route, forKey: "route")
        coder.encode(params, forKey: "params")
    }
}

下面是我如何保存我的 PendingRequest 列表:

private static func savePendingRequests(requestsToSend: [PendingRequest])
{
    let data = NSKeyedArchiver.archivedData(withRootObject: requestsToSend!)
    UserDefaults.standard.set(data, forKey: self.requestsToSendDefaultsString)
}

下面是我尝试检索它的方法:

let data = UserDefaults.standard.data(forKey: requestsToSendDefaultsString)
let requests = NSKeyedUnarchiver.unarchiveObject(with: data!) as! [PendingRequest]
return requests

但是我的代码在检索我的数据时崩溃了……保存工作正常,但无法检索……有什么想法吗?

编辑:这是我的 Crashlytics 错误:

*** -[NSKeyedUnarchiver decodeObjectForKey:]: 无法为 key (NS.objects) 解码类 (_TtCC6Versus9VersusAPIP33_8D2B8AA415FDC4F8DFAF29D7ECE33C1F14PendingRequest) 的对象;该类可能在源代码或未链接的库中定义

解决方案:

我的类 PendingRequestfileprivate,因此 NSKeyedUnarchiver 无法访问它,因此崩溃...感谢您的帮助。

最佳答案

有些事情是不正确的

你忘记在初始化器中调用 super.init()

init(route: String, params: [String: AnyObject])
{
    self.route = route
    self.params = params
    super.init()
}
required init(coder aDecoder: NSCoder)
{
    self.route = aDecoder.decodeObject(forKey: "route") as? String
    self.params = aDecoder.decodeObject(forKey: "params") as? [String: AnyObject]


    // Check if route and params are what you expected here


    super.init()
}

你有一个调用“self”的静态方法,我不确定这是否有效,你仍然可以有一个静态键或一个全局键。 另外,您正在展开一个非可选值“requestsToSend”。 我认为这会解决问题。

private static func savePendingRequests(requestsToSend:[PendingRequest])
{
     let data = NSKeyedArchiver.archivedData(withRootObject: requestsToSend)
     UserDefaults.standard.set(data, forKey: "AStaticKey")
}

然后检索应该工作。 (我添加了一些安全检查)

guard let data = UserDefaults.standard.data(forKey: "AStaticKey"), 
      let requests = NSKeyedUnarchiver.unarchiveObject(with: data) as? [PendingRequest] else {
         return [PendingRequest]()
      }
return requests

关于 swift 3 : [String: AnyObject] using NSCoding protocol to save with NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39775362/

相关文章:

arrays - 打印 Core Data bool 数组返回换行符

ios - 来自 HTTPS URLSession.dataTask 的 0 字节数据

ios - 用户切换选项卡栏项目后导航项目未更新

ios - 应用程序退出时保存 NSUserDefaults

ios - 使用 NSCoding 将对象解码为 Int 时抛出的错误是 : fatal error: unexpectedly found nil while unwrapping an Optional value

swift - Xamarin 中的 CGMutablePath

ios - 从键中删除对象后,是否需要在 NSUserDefaults 中进行同步?

iOS NSUserDefaults 加载缓慢

ios - NSCoding-解码器返回错误值-iOS

ios - 如何知道文件是否已编码?