【发布时间】:2020-08-01 04:24:42
【问题描述】:
提前感谢您的帮助。
我想保留用户统计信息等数据。假设我有一个数据模型,一个具有一些属性的“Stats”类,它被保存到用户的设备中。假设我已经发布了该应用程序,用户正在记录他们的统计信息,但后来我想在新的构建版本之前对类进行更改 - 更多或更少的属性,甚至可能重命名它们(等等)。但是在进行了这些更改之后,“Stats”类型现在与用户保存在其设备上的类型不同,因此它将无法解码,而且似乎用户之前的所有数据都将迷失/无法实现。
如何以 PropertyListDecoder 仍然能够解码用户设备上的统计信息的方式对类进行这些类型的更改?
这基本上就是我所拥有的:
class Stat: Codable {
let questionCategory = questionCategory()
var timesAnsweredCorrectly: Int = 0
var timesAnsweredFirstTime: Int = 0
var timesFailed: Int = 0
static func saveToFile(stats: [Stat]) {
let propertyListEncoder = PropertyListEncoder()
let encodedSettings = try? propertyListEncoder.encode(stats)
try? encodedSettings?.write(to: archiveURL, options: .noFileProtection)
}
static func loadFromFile() -> [Stat]? {
let propertyListDecoder = PropertyListDecoder()
if let retrievedSettingsData = try? Data(contentsOf: archiveURL), let decodedSettings = try? propertyListDecoder.decode([Stat].self, from: retrievedSettingsData) {
return decodedSettings
} else {
return nil
}
}
}
static let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
static let archiveURL = documentsDirectory.appendingPathComponent("savedVerbStats").appendingPathExtension("plist")
似乎即使只是向“Stat”添加一个新属性也会导致用户之前的持久化数据无法解码为“Stat”类型,并且 loadFromFile() 将返回 nil。
任何建议都会很棒!我确定我会以错误的方式解决这个问题。我认为数组 [Stat] 太大而无法保留在 UserDefaults 中,但即便如此我认为这个问题仍然存在......在网上找不到任何关于它的信息;似乎一旦你让你的用户使用了一个持久化的类,你就不能再改变它了。我尝试对新属性使用默认值,但结果是一样的。
我能想到的唯一解决方案是将类分解为文字并将所有这些保存在某种元组/字典形式中。然后我会解码这些原始数据,并有一个函数来组装和创建类,这些数据仍然可以从旧版本的 'Stat' 类型中获取。似乎是一个很大的解决方法,我相信你们知道更好的方法。
谢谢!!
【问题讨论】:
标签: swift xcode types persistence decoder