UserDefaults是否可以在每个.synchronize()之后继续保存新数据?

我写了一个应用程序,包括主程序a和操作扩展B。
用户可以使用操作扩展B将一些数据保存到用户默认值中。
这样地:

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打开时将此数据传输到主程序。
但是如果我使用action extension两次来保存data1和data2这样的数据,那么我打开主程序A,只有data2被A接收,这意味着新数据总是覆盖UserDefaults中的新数据。
所以,我想知道我是否可以在用户默认设置中保存多个数据,并且这些数据都将传输到主程序A?
提前谢谢。。。


最佳答案:

要将多个数据保存到UserDefaults中,应该对该数据使用唯一键。另请阅读关于synchronization
因为这个方法是定期自动调用的,
仅当您不能等待自动
同步(例如,如果您的应用程序即将退出)
如果要更新用户的默认值,即使
你没有做任何改变。
如果数据是描述性的,就像你描述的那样。尝试使用结构来表示模型。
用户示例:

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
    }

}

结构和struct的使用。
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>)