【问题标题】:can UserDefaults continue save new data after each .synchronize()?UserDefaults 可以在每个 .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?

提前谢谢...

【问题讨论】:

    标签: ios swift synchronization userdefaults


    【解决方案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():“等待对默认数据库的任何挂起的异步更新并返回;此方法是不必要的,不应使用。”
    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多