1

我写了一个应用程序,包括一个主程序 A 和一个动作扩展 B。

用户可以使用操作扩展 B 将一些数据保存到 UserDefaults。像这样:

let defaults = UserDefaults(suiteName: "group.com.ZeKai")
    defaults?.set(self.doubanID, forKey: "doubanID")
    defaults?.set(self.doubanRating, forKey: "doubanRating")
    defaults?.set(self.imdbRating, forKey: "imdbRating")
    defaults?.set(self.rottenTomatoesRating, forKey: "rottenTomatoesRating")
    defaults?.set(self.chineseTitle, forKey: "chineseTitle")
    defaults?.set(self.originalTitle, forKey: "originalTitle")
    defaults?.synchronize()

正在打开 A 时将此数据传输到主程序 A。

但是如果我两次使用动作扩展来保存data1和data2之类的数据,那么我打开主程序A,A只接收到data2,意味着新数据总是覆盖UserDefaults中的新数据。

所以,我想知道我是否可以在UserDefaults中保存多个数据,并将它们全部转移到主程序A?

提前致谢...

4

1 回答 1

1

要将多个数据保存到UserDefaults您应该使用该数据的唯一键。另请阅读synchronization

由于此方法会定期自动调用,因此仅当您无法等待自动同步(例如,如果您的应用程序即将退出)或您想要更新用户默认值时才使用此方法,即使您没有进行任何更改。

如果数据是描述性的,如您所描述的那样。尝试使用结构来表示模型。

用户示例struct

public struct User {

    public var name: String

    init(name: String) {
        self.name = name
    }

    public init(dictionary: Dictionary<String, AnyObject>){
        name = (dictionary["name"] as? String)!
    }

    public func encode() -> Dictionary<String, AnyObject> {
        var dictionary : Dictionary = Dictionary<String, AnyObject>()
        dictionary["name"] = name as AnyObject?
        return dictionary
    }

}

结构的使用和UserDefaults

let user1 = User(name: "ZeKai").encode()
let user2 = User(name: "Oleg").encode()

let defaults = UserDefaults(suiteName: "User")
defaults?.set(user1, forKey: "User1")
defaults?.set(user2, forKey: "User2")
defaults?.synchronize()

let user1EncodeData = defaults?.dictionary(forKey: "User1")        
let user = User(dictionary: user1EncodeData as! Dictionary<String, AnyObject>)
于 2017-04-24T09:52:20.147 回答