2014-05-19 91 views
1

这是我一直在玩的东西,还没有让我的头脑。用NSDictionary创建一个模型对象

在查询数据库时,您将使用响应中的数据来创建自定义模型对象是非常常见的。我们以'Book'为例。

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

  • 使所有属性Book mutable(我讨厌这个选项)。然后,您可以获得BookManager类,并使用NSArrayNSDictionary s,并将字典中的数据映射到正确的属性。

  • Book对象添加一个初始者,该对象接受重要细节。

实施例:

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

上述BookManager类可以那么作为之前采取NSDictionary S,但创建Book对象与该初始化剂。这很好,因为您可以在Bookreadonly上制作所有面向公众的物业。然而,这是非常有限的,如果(通常情况下)模型上有很多属性,这是不可行的。

  • 添加一个初始化程序到Book它接受NSDictionary表示它自己。我不喜欢这种方法,因为我觉得责任不是从字典中创建自己的模型。我更喜欢经理类将字典映射到模型的想法。不过,我确实喜欢这样一个事实,即它意味着所有属性都可以是readonly

毫无疑问,在我的脑海里,我错过了其他选择,如果你知道它们,请将它们指出来。这个问题的目的是最终确定处理这种情况的最佳方式。

+0

的方法http://stackoverflow.com/questions/5873776/using-nsmutabledictionary-as-backing-store-for-properties –

+0

对于一般情况,我更喜欢init接受字典的方法。这个方案非常灵活,当你有一个超类或内部字典和子对象时,它会自然地“级联”,如果你希望使用一个使用KVC来执行某些入口的公共内核,你就可以自动“级联”。 (提示,使用可变字典并在你“消耗”它们时移除键,然后剩下的东西可以被“共同核心”使用) –

+0

调查地幔 - 可能更简单,更通用https://github.com/ Mantle/Mantle/blob/master/Mantle/MTLManagedObjectAdapter.h –

回答

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 

如果你搜索“withDictionary”和“dictionaryRepresentation”的iOS版的文件,你会看到,这是常用的几个地方。在其他SDK中,您有时会看到名为someObjectFromDictionary:

+0

这种模式的不幸部分是将所有为函数参数保留的冗余移动到一堆字符串中。在字典中含糊不清的类型的复合词,您在开始的时候会右转,但安全性比以前更低。 – CodaFi