使用NSDictionary创建模型对象

时间:2014-05-19 10:46:55

标签: ios objective-c json

这是我一直在玩的东西,还没有让我明白。

查询数据库时,通常会使用响应中的数据来创建自定义模型对象。让我们使用“Book'举个例子。

我收到了描述多个JSON个对象的Book。我将JSON解析为NSArrayNSDictionary。我现在有几个选择:

  • 使Book上的所有属性都可变(我讨厌这个选项)。然后,您可以使用BookManager类,NSArray NSDictionary,并将字典中的数据映射到正确的属性。

  • Book对象添加初始化程序,该对象接受重要的详细信息。

示例:

- (instancetype)initWithTitle:(NSString *)title author:(NSString *)author publishDate:(NSDate *)publishDate;

上述BookManager类可以像以前一样使用NSDictionary s,但使用此初始化程序创建Book个对象。这很好,因为您可以在Book readonly上制作所有面向公众的属性。但是,它非常有限,如果(通常是这种情况)模型上有很多属性,这是不可行的。

  • Book添加初始化程序,该NSDictionary接受readonly自身的表示形式。我不喜欢这种方法,因为我认为责任不是从字典中创建自己的模型。我更喜欢将字典映射到模型的管理器类的想法。但是,我确实认为这意味着所有属性都可以是{{1}}。

毫无疑问,在我看来,我错过了其他选择,如果您了解它们,请指出它们。这个问题的目的是最终确定处理这种情况的最佳方法。

2 个答案:

答案 0 :(得分:1)

我经常使用带有重要参数的init方法,但是,当参数的数量达到两位数和/或几个参数可以为零时,它变得非常笨拙。我在iOS SDK中看到的最长的方法是CLLocation'

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate
                altitude:(CLLocationDistance)altitude
      horizontalAccuracy:(CLLocationAccuracy)hAccuracy
        verticalAccuracy:(CLLocationAccuracy)vAccuracy
                  course:(CLLocationDirection)course
                   speed:(CLLocationSpeed)speed
               timestamp:(NSDate *)timestamp

关于您的上一个选项,向initWithDictionary:添加Book方法可以扩展为包含用于从Book创建NSDictionary实例的类级方法。

+ (instancetype)bookWithDictionary:(NSDictionary *)dictionary

可选择从Book实例获取字典表示的便捷方式。

- (NSDictionary *)dictionaryRepresentation

如果您在iOS文档中搜索" withDictionary"和" dictionaryRepresentation"你会看到一些使用它的地方。在其他SDK中,您有时会看到名为someObjectFromDictionary:

的方法

答案 1 :(得分:0)