这是我一直在玩的东西,还没有让我明白。
查询数据库时,通常会使用响应中的数据来创建自定义模型对象。让我们使用“Book'举个例子。
我收到了描述多个JSON
个对象的Book
。我将JSON
解析为NSArray
个NSDictionary
。我现在有几个选择:
使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}}。毫无疑问,在我看来,我错过了其他选择,如果您了解它们,请指出它们。这个问题的目的是最终确定处理这种情况的最佳方法。
答案 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)
我想你可以使用JSONModel
来做到这一点看到这个
http://code.tutsplus.com/tutorials/getting-started-with-jsonmodel--cms-19840 https://github.com/icanzilb/JSONModel