应用程序的 1.0 版本有一个数据模型,它使用 NSKeyed(Un)Archiver 类保存/加载,因为所有模型类都遵守 NSCoding 协议(protocol)。假设存在以下层次结构:
-> Houses (NSMutableArray)
-> -> House (Custom Object)
-> -> -> Color (3 ints, RGB)
-> -> -> Number of Residents (int)
假设有以这种方式存储的遗留文件,但需要使用以下较新的数据模型加载到应用程序的 2.0 版本中以实现向后兼容性:
-> Neighborhood (Maintains NSMutableArray, among other properties)
-> -> TownHouse
-> -> -> Color (3 ints, RGB)
-> -> -> Occupants (NSMutableArray)
-> -> (Other types of houses)
显然,有些数据会丢失,需要填写。例如。需要为之前存在的每个“居民数量”创建一个基本的“占用者”对象。我正在寻找一种以编程方式加载先前数据模型的方法,特别是如果我只有类/层次结构列表,而不是 .m/.h 文件本身。
所以我想做的是(假设我有一个文件 Houses.data,它是使用 Houses 数组序列化的):
NSFile *legacyFile;
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile];
有什么想法吗?
最佳答案
我认为这里的技巧是使用 NSKeyedUnarchiver 提供的 setClass:forClassName: 函数。它允许您说:“使用 TownHouse 类来反序列化 House 类的所有实例。”
然后您需要修改 TownHouse 的 initWithCoder: 函数来解码任一层次结构。您可以通过调用decodeObject或decodeObjectForKey:然后使用isKindOfClass:来查看您正在处理的对象类型来完成此操作。您还可以使用 containsValueForKey: 在尝试读出某些键之前检查它们。
希望对您有所帮助!
关于ios - 以编程方式加载使用 NSCoding 创建的对象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1030467/