终止后如何检查UserDefaults并在Xcode中重新打开应用程序(swift)

时间:2018-01-17 14:24:50

标签: ios swift archive codable userdefaults

我存档了一个采用Codable的对象,并在应用程序进入后台时实现存储对象数据,并在重新打开应用程序时加载它们。

但它不起作用。

如何在终止并重新打开模拟器后检查UserDefaults的更改?

我制作了'Machine'类Codable,并实现了'MachineStore'类来存档Machine对象。

保存数据:

func saveChanges() {
    var data = Data()
    do {
        data = try encoder.encode(self.machine)
    } catch {
        NSLog(error.localizedDescription)
    }
    UserDefaults.standard.set(data, forKey: MachineStore.Key)
}

正在加载数据:

func loadMachine() {
    guard let data = UserDefaults.standard.data(forKey: MachineStore.Key) else { return }
    do {
        machine = try decoder.decode(VendingMachine.self, from: data)
    } catch {
        NSLog(error.localizedDescription)
    }
}

我在AppDelegate中使用了MachineStore。

let machineStore: MachineStore = MachineStore()

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    machineStore.loadMachine()
    return true
}

func applicationDidEnterBackground(_ application: UIApplication) {
    machineStore.saveChanges()
}

1 个答案:

答案 0 :(得分:1)

之前对您的对象进行编码/解码。您可以使用以下代码:

extension UserDefaults {
    func persist<Value>(_ value: Value, forKey key: String) where Value : Codable {
        guard let data = try? PropertyListEncoder().encode(value) else { return }
        set(data, forKey: key)
    }

    func retrieveValue<Value>(forKey key: String) -> Value? where Value : Codable {
        return data(forKey: key).flatMap { try? PropertyListDecoder().decode(Value.self, from: $0) }
    }
}