ios - 以编程方式加载使用 NSCoding 创建的对象模型

标签 ios objective-c iphone xcode nscoding

应用程序的 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/

相关文章:

iPhone:自定义 DataGrid View 、子类 UITableView 或其他?

android - 在 Windows 7 上为 iOS 生成配置证书

ios - didFinishLaunchingWithOptions 不显示初始警报 (PubNub)

ios - 私有(private)数据库中的 CloudKit 订阅

ios - 代码签名错误 : bundle format unrecognized, 无效,或不合适

objective-c - 我可以使用webview的scrollview.bounces属性来处理webview滚动吗?

ios - 拉动刷新默认刷新级别更改

ios - 从 NSLocale.preferredLanguages 数组中删除区域代码

iphone - 让 paulirish 的 Infinite-Scroll 在 iPhone 上运行

ios - 设备自动锁定时 AVPlayer 在 iPad 上不工作