我有我的自定义类:
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) 的对象;该类可能在源代码或未链接的库中定义
解决方案:
我的类 PendingRequest
是 fileprivate
,因此 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/