UserDefaults 可以在每次 .synchronize() 之后继续保存新数据吗?

can UserDefaults continue save new data after each .synchronize()?

我写了一个应用程序,包括一个主程序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。

但是如果我两次使用action extension来保存data1和data2这样的数据,然后我打开主程序A,A只接收到data2,意味着总是新数据覆盖UserDefaults中的新数据。

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

提前致谢...

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

Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes.

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

用户示例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>)