Ios 使用NSDictionary创建模型对象

Ios 使用NSDictionary创建模型对象,ios,objective-c,json,Ios,Objective C,Json,这是我一直在玩的东西,我还没有下定决心 查询数据库时,使用响应中的数据创建自定义模型对象是非常常见的。让我们以“书”为例 我收到了描述多个Book对象的JSON。我将JSON解析为NSDictionarys的NSArray。我现在有几个选择: 使Book上的所有属性都可变(我讨厌这个选项)。然后,您可以使用NSDictionarys的NSArray,创建一个BookManager类,并将字典中的数据映射到正确的属性 向接受重要细节的Book对象添加一个初始化器 例如: - (instance

这是我一直在玩的东西,我还没有下定决心

查询数据库时,使用响应中的数据创建自定义模型对象是非常常见的。让我们以“书”为例

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

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

  • 向接受重要细节的
    Book
    对象添加一个初始化器

例如:

- (instancetype)initWithTitle:(NSString *)title author:(NSString *)author publishDate:(NSDate *)publishDate;
前面提到的
BookManager
类可以像以前一样使用
NSDictionary
s,但是使用这个初始化器创建
Book
对象。这很好,因为您可以将
书籍
上所有面向公众的属性设置为只读。然而,这是非常有限的,如果(通常情况下)模型上有很多属性,这是不可行的

  • Book
    添加一个初始值设定项,该初始值设定项接受自身的
    NSDictionary
    表示。在某种程度上,我不喜欢这种方法,因为我觉得模型的责任不是从字典中创建自己。我更喜欢管理类将字典映射到模型的想法。但是,我确实喜欢这样一个事实,即它意味着所有属性都可以是只读的

毫无疑问,在我看来,我错过了其他选择,如果您知道,请指出。这个问题的目的是最终确定实现这个场景的最佳方法。

我认为您可以使用JSONModel来实现这一点

看到这个了吗


我经常对重要参数使用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
可以扩展为还包括用于从
NSDictionary
创建
Book
实例的类级方法

+ (instancetype)bookWithDictionary:(NSDictionary *)dictionary
以及从
书籍
实例获取字典表示的一种方便方法

- (NSDictionary *)dictionaryRepresentation

如果您在iOS文档中搜索“withDictionary”和“dictionaryRepresentation”,您将看到一些使用此功能的地方。在其他SDK中,您有时会看到名为
someObjectFromDictionary:

的方法,这基本上是让模型本身将字典键映射到它们各自的属性。对于一般情况,我更喜欢接受字典的init方法。这个方案非常灵活,当您有一个超类或带有子对象的内部字典时,它会自然地“级联”,如果您愿意,您可以使用一个利用KVC进行一些初始化的公共核心。(提示,使用可变字典并在“使用”键时删除键。然后,剩下的任何键都可以被“公共核心”使用。)查看Mantle-可能更简单、更通用此模式的不幸部分是,您将为函数参数保留的所有详细信息移动到一组字符串中。在字典中用模棱两可的类型将其复合,你会回到你开始的地方,但比以前更不安全。