在 NSUserDefaults 中存储字典并使用存储的数据。
Posted
技术标签:
【中文标题】在 NSUserDefaults 中存储字典并使用存储的数据。【英文标题】:Storing a dictionary in NSUserDefaults and using the data stored. 【发布时间】:2015-09-02 12:50:56 【问题描述】:我已经为这个问题苦苦挣扎了 5 天。不是开玩笑。请帮忙!这是我遇到的问题。
我所知道的:
我将var addressDict = Dictionary<Int, Array<String>>()
声明为全局变量。现在,我了解以下代码用于附加存储在我的 addressDict 中的数据并更改类型,以便可以将数据存储到 NSUserDefaults 中。
let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData
let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)
现在,每次我运行应用程序时,存储在addressDict2
中的数据都会被我的addressDict
覆盖,因为当应用程序启动时,addressDict
中没有数据。因此,即使我可能在addressDict2
中添加了一些数据,它也会被没有数据的addressDict
覆盖。
因此,为了解决这个问题,我可以运行上面的代码,但没有 self.defaults.setObject(data, forKey: "addressDict")
行,现在,addressDict2
不再被不包含数据的变量 addressDict
覆盖。所以我附加的数据存储在addressDict2
。但是,如果我这样做,我将无法再将新信息附加到addressDict2
,因为我不再拥有self.defaults.setObject(data, forKey: "addressDict")
。我希望你在这里看到我的困境......
我想知道的:
这就是我希望我的代码执行的操作。我希望能够将新信息附加到某个变量中,例如addressDict2
。当应用程序启动时,我希望将addressDict2
中的数据复制到addressDict
。所以这将导致addressDict
保存我希望它保存的数据。
我的尝试:
为了解释我上面的意思,这里有一些代码。请注意,此代码不起作用,它只是为了澄清我的意思并显示以下代码是否有效,我认为它将解决我的问题(如果我我错了)。所以在我的viewDidLoad()
中,我会有类似的内容:
override func viewDidLoad()
super.viewDidLoad()
if NSUserDefaults.standardUserDefaults().objectForKey("addressDict") != nil
if let data2 = defaults.objectForKey("addressDict") as? NSData
addressDict = NSKeyedUnarchiver.unarchiveObjectWithData(data2) //there is an error here that states: "Cannot assign a value of type AnyObject? to a value of type Dictionary<Int, Array<Strings>>
所以现在,当我运行这段代码时:
let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData
let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)
这里的addressDict
将不再为空,也不会用空数据覆盖addressDict2
。我将能够使用addressDict
处理所有永久存储的数据!生活将是美好的。但我不知道该怎么做。
附注对于问题的长度,我深表歉意。感谢您的宝贵时间!
【问题讨论】:
我已经回答了你的问题here。我发布的代码可以编译并且工作正常。你需要的是一个简单的类型转换。 实际上不需要使用NSKeyedUnarchiver
,因为包含Int
、String
和Array
类型的字典符合属性列表。
@Adam,我不确定你是否回答了我在这里提出的问题(当然,我很可能是不正确的)。我想我更进一步,正如@Rajatp 所说,合并addressDict
和addressDict2
以便addressDict2
中的数据可以“放入”addressDict
。
【参考方案1】:
同时将数据保存到字典中:
let foundationDictionary = NSMutableDictionary(dictionary: StoreDictionary) let dict = NSKeyedArchiver.archivedDataWithRootObject(foundationDictionary) NSUserDefaults.standardUserDefaults().setObject(dict, forKey: "yourkey")
使用保存的数据时:
if NSUserDefaults.standardUserDefaults().objectForKey("UserDetails")!=nil
let dict : NSData = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as! NSData dictionaryName = NSKeyedUnarchiver.unarchiveObjectWithData(dict) as? NSDictionary
【讨论】:
以上是关于在 NSUserDefaults 中存储字典并使用存储的数据。的主要内容,如果未能解决你的问题,请参考以下文章
更改 NSUserDefaults 中的对象而不创建和重新设置副本
存储 NSUserDefaults (Xcode) 时避免重复