-1

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

但它不起作用。

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

我制作了可编码的“机器”类,并实现了归档机器对象的“机器商店”类。

保存数据:

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()
}
4

1 回答 1

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) }
    }
}
于 2018-01-17T14:43:55.697 回答