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

Posted

技术标签:

【中文标题】UserDefaults 可以在每个 .synchronize() 之后继续保存新数据吗?【英文标题】:can UserDefaults continue save new data after each .synchronize()? 【发布时间】:2017-04-24 09:49:55 【问题描述】:

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

提前谢谢...

【问题讨论】:

【参考方案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>)

【讨论】:

@ZeKai 欢迎你来 根本不再需要调用synchronize():“等待对默认数据库的任何挂起的异步更新并返回;此方法是不必要的,不应使用。”

以上是关于UserDefaults 可以在每个 .synchronize() 之后继续保存新数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将完整的 UserDefaults 列表放入 tableview - Swift 3

Bluemix Cloudant synch api 可以有一个字段来存储图像吗?

UserDefaults/KeyedArchiver 挫折

在 UserDefaults 中保存项目数组 - iOS 12

如何将两个 UITextView 中的数据保存到 UserDefaults

通过 INDEX 更新和删除 userDefaults 中的对象