如何保存和阅读NSUserDefaults的词典?

时间:2015-07-06 00:12:38

标签: ios swift nsuserdefaults

我有一个字典=字符串:([(字符串)],[(Int)],NSDate,Bool,[(字符串)])当我调用applicationWillTerminate

    var codes = [(String)]()
    var messages = [[String]]()
    var senders = [[Int]]()
    var dates = [(NSDate)]()
    var bools = [(Bool)]()
    var pairs = [[String]]()

    for code in self.dictionary.keys {

        codes.append(code)
        messages.append(self.dictionary[code]!.0)
        senders.append(self.dictionary[code]!.1)
        dates.append(self.dictionary[code]!.2)
        bools.append(self.dictionary[code]!.3)
        pairs.append(self.dictionary[code]!.4)

    }

    self.userDefaultsMessages.setObject(codes, forKey: "userMessagesArrays")
    self.userDefaultsSenders.setObject(messages, forKey: "userSentArrays")
    self.userDefaultsDates.setObject(senders, forKey: "userDatesArray")
    self.userDefaultsDeletedBool.setObject(dates, forKey: "userDeletedArrays")
    self.userDefaultsPairs.setObject(bools, forKey: "userPairsArrays")
    self.userDefaultsCodeKeys.setObject(pairs, forKey: "userCodesArrays")

    self.userDefaultsCodeKeys.synchronize()
    self.userDefaultsMessages.synchronize()
    self.userDefaultsSenders.synchronize()
    self.userDefaultsDates.synchronize()
    self.userDefaultsDeletedBool.synchronize()
    self.userDefaultsPairs.synchronize()

然后当app调用applicationDidBecomeActive

时,我尝试将它们全部拉回来

//读         如果让savedCodesArray:AnyObject? = self.userDefaultsCodeKeys.objectForKey(" userCodesArrays"){             self.userCodes = savedCodesArray!如! [字符串]

        if let savedMessagesArray : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userMessagesArrays") {
            self.Usermessages = savedMessagesArray! as! [[String]]

            if let savedSendersArray : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userSentArrays") {
                self.Usersenders = savedSendersArray! as! [[Int]]

                if let savedDatesArray : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userDatesArray") {
                    self.Userdates = savedDatesArray! as! [NSDate]

                    if let savedBools : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userDeletedArrays") {
                        self.Userbools = savedBools! as! [Bool]

                        if let savedPairs : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userPairsArrays") {
                            self.Userpairs = savedPairs! as! [[String]]
                            var indexPath: Int = 0
                            for code in self.userCodes {
                                self.dictionary[code]! = [self.Usermessages[indexPath], self.Usermessages[indexPath], self.Userdates[indexPath], self.Userbools[indexPath], self.Userpairs[indexPath]]

                            }
                        }
                    }
                }
            }
        }
    }

我对iOS开发相当新,可以使用帮助,如何将单个字典= String:([(String)],[(Int)],NSDate,Bool,[(String)])保存到NSUserDefaults然后阅读它..文档不是很有用,因为它只适用于简单的词典

代码看起来非常繁琐,所以我知道我不能做得对。它应该是一个简单的解决方案,因为我只有一个变量可以保存到NSUserDefaults。

2 个答案:

答案 0 :(得分:5)

简短回答:你不能。

NSUserDefaults只会记录"属性列表对象" (字典,数组,字符串,数字(整数和浮点数),日期,二进制数据和布尔值)。

您无法将任何其他类型的数据保存到NSUserDefaults或属性列表中。唯一的解决方案是将其他数据类型转换为这些类型。

元组不属于这些类型之一,因此无法将其保存到用户默认值中。

答案 1 :(得分:0)

首先,您与NSUserDefaults的互动完全错误。您只需要与共享的NSUserDefaults.sharedUserDefaults()实例进行交互,而不是创建单独的实例,这似乎就是您正在做的事情(即userDefaultsMessagesuserDefaultsSenders等)。

其次,您根本不需要致电synchronize()。您需要手动调用它的条件很少,而这不是其中之一。

第三,在NSUserDefaults中存储特定元组的最简单方法是将其转换为数组(或NSArray)并存储结果。当然,这假设元组只包含可序列化的类型,您的示例似乎包含这些类型。遗憾的是,没有通用的解决方案,但是从元组创建数组是直截了当的,因为您可以将元组索引映射到数组索引。

最后,这样的大元组通常是沿线某处设计不良的结果。也许重构有助于解决存储问题?