В моем приложении в качестве модели данных используется пользовательский класс:
class Drug: NSObject, NSCoding {
// Properties, methods etc...
}
Я только что создал расширение «Сегодня», и мне нужно получить доступ к данным пользователя из него, поэтому я использую NSCoding для сохранения своих данных как в контейнере приложения, так и в общем контейнере. Это функции сохранения и загрузки в основном приложении:
func saveDrugs() {
// Save to app container
let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(drugs, toFile: Drug.ArchiveURL.path)
if isSuccessfulSave {
print("Drugs successfully saved locally")
} else {
print("Error saving drugs locally")
}
// Save to shared container for extension
let isSuccessfulSaveToSharedContainer = NSKeyedArchiver.archiveRootObject(drugs, toFile: Drug.SharedArchiveURL.path)
if isSuccessfulSaveToSharedContainer {
print("Drugs successfully saved to shared container")
} else {
print("Error saving drugs to shared container")
}
}
func loadDrugs() -> [Drug]? {
return NSKeyedUnarchiver.unarchiveObject(withFile: Drug.ArchiveURL.path) as? [Drug]
}
Я столкнулся с проблемой пространства имен классов, когда NSKeyedUnarchiver в моем расширении Today не мог правильно декодировать объект, поэтому я использовал этот ответ и добавил @objc
перед определением класса:
@objc(Drug)
class Drug: NSObject, NSCoding {
// Properties, methods etc...
}
Это отлично решило проблему. Однако это будет версия 1.3 моего приложения, и кажется, что это нарушает процесс разархивирования ранее существовавших данных (как я и думал).
Как лучше всего справиться с этим сценарием, если я просто внесу это изменение, новая версия приложения выйдет из строя для существующих пользователей!
Я не могу найти никаких других ответов по этому поводу, и я не уверен, что метод NSKeyedArchiver.setClass()
актуален, и я не уверен, где его использовать.
Любая помощь будет принята с благодарностью. Спасибо.