将NSIndexPaths映射到数据标识符

时间:2014-09-12 12:40:03

标签: ios mvvm swift

我正在使用集合视图来显示从服务器接收的数据。返回的json数组是这样的:

[
    {
        "id": 13644766,
        "check_in": "2014-04-22",
        "check_out": "2014-04-29",
        "property_id": 1980
    },
    {
        "id": 13644763,
        "check_in": "2014-04-22",
        "check_out": "2014-04-29",
        "property_id": 1978
    },
    {
        "id": 13644761,
        "check_in": "2014-04-22",
        "check_out": "2014-04-29",
        "property_id": 2591
    },
    {
        "id": 13644764,
        "check_in": "2014-04-22",
        "check_out": "2014-04-29",
        "property_id": 1978
    }
]

我使用集合视图来显示数据,并且必须实现UICollectionViewDataSource协议。更具体地说,一个部分包含具有相同property_id的所有预订。所以我必须进行数据转换才能将json数组映射到section和items。在反序列化JSON和数据转换后的Swift中它看起来像这样(键是property_id,value是该property_id的预订数组):

[
   1980: [["id": 13644766, "check_in": "2014-04-22", "check_out": "2014-04-29"]],
   1978: [
            ["id": 13644763, "check_in": "2014-04-22", "check_out": "2014-04-29"]
            ["id": 13644764, "check_in": "2014-04-22", "check_out": "2014-04-29"]
         ],
   2591: [["id": 13644761, "check_in": "2014-04-22", "check_out": "2014-04-29"]]
]

但是我想在模型层中保留一个简单的数组,而不是数组的字典,因为它对它执行CRUD操作比在数组字典上更容易。

更一般地说,我要问的是:如何处理从模型到视图控制器的数据格式化(数据源方法numberOfSectionsInCollectionView:collection:numberOfItemsInSection:和{{1}所必需的})。

我想在预订数组上有一个执行数据转换的只读计算属性。但它可能会对性能产生影响。如果计算属性不是一个选项,我怎么能保持这两个数据结构同步?

1 个答案:

答案 0 :(得分:1)

首先,我强烈建议您将字典数组转换为对象数组。应该将JSON解析为模型对象,而不是字典。我一直在编写一个关于这种解析的系列文章,从Functional Wish Fulfillment开始,但你可以使用任何你想要解析的技术。只需将它放入对象(通常是Swift中的结构)。然后你将拥有你的简单数组。

除此之外,在各种Cocoa圈子中越来越倾向于解决“我如何展示这一点”是从传统MVC架构到MVVM架构的过渡。在MVVM体系结构中,您在ViewController和Model之间添加了一个额外的“View Model”层。 ViewModel的工作是将数据按摩到显示层所希望的形式。一旦在模型中有一个好的对象,这可能是必要的,也可能不是必需的。但是,如果您的模型设计与您的View需求不完全匹配,则ViewModel是一个很好的中介。