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 中保存项目数组 - iOS 12