代码之家  ›  专栏  ›  技术社区  ›  Craig Otis

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

  •  0
  • Craig Otis  · 技术社区  · 15 年前

    应用程序的1.0版有一个数据模型,该模型使用nskeyed(un)存档程序类保存/加载,因为所有模型类都遵循nscoding协议。假设存在以下层次结构:

    -> 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];
    

    有什么想法吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Ben Gotow Dmitry Nogin    15 年前

    我认为这里的技巧是使用nskeyedunarchiver提供的setclass:forclassname:函数。它允许您说:“使用类联排别墅反序列化类房屋的所有实例。”

    然后您需要修改您的联排别墅的initwithcoder:function来解码任何层次结构。您可以通过调用decodeObject或decodeObjectforkey:然后使用iskindofclass:来查看您正在处理的对象类型来完成此操作。您还可以使用containsValueForkey:在尝试读取某些键之前检查它们。

    希望有帮助!