代码之家  ›  专栏  ›  技术社区  ›  PaFi

以用户默认值保存状态

  •  0
  • PaFi  · 技术社区  · 7 年前

    也许有人可以看看我的代码,看看它是否有意义。

    class TopFlopState: Codable, PersistenceState {
    
        var group: Groups = .large {
            didSet {
                save()
            }
        }
        var base: Bases = .usd {
            didSet {
                save()
            }
        }
        var valueOne: StatIntervalBaseModel = StatIntervalBaseModel(stat: "ppc", interval: "24h", base: "usd") {
            didSet {
                save()
            }
        }
    
        init(){
            let savedValues = load()
            if savedValues != nil {
                self.group = savedValues!.group
                self.base = savedValues!.base
                self.valueOne = savedValues!.valueOne
            }
        }
    }
    

    这是PersistenceState协议:

    /**
    Saves and Loads the class, enum etc. with UserDefaults.
    Has to conform to Codable.
    Uses as Key, the name of the class, enum etc.
    
     */
    protocol PersistenceState  {
    }
    
    
    extension PersistenceState where Self: Codable {
    
    
        private var keyUserDefaults: String {
            return String(describing: self)
        }
    
        func save() {
            saveUserDefaults(withKey: keyUserDefaults, myType: self)
        }
    
        func load() -> Self? {
            return loadUserDefaults(withKey: keyUserDefaults)
        }
    
        private func saveUserDefaults<T: Codable>(withKey key: String, myType: T){
            do {
                let data = try PropertyListEncoder().encode(myType)
                UserDefaults.standard.set(data, forKey: key)
                print("Saved for Key:", key)
            } catch {
                print("Save Failed")
            }
        }
    
        private func loadUserDefaults<T: Codable>(withKey key: String) -> T? {
            guard let data = UserDefaults.standard.object(forKey: key) as? Data else { return nil }
            do {
                let decoded = try PropertyListDecoder().decode(T.self, from: data)
                return decoded
            } catch {
                print("Decoding failed for key", key)
                return nil
            }
        }
    }
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   Hendra Halim    7 年前

    在我看来,它还回了缓存。因为在 Apple official documentation ,它说明

    也许你可以改变流程,什么时候保存数据。在代码中显示,在init()中调用save()3次。