我正在使用集合视图来显示从服务器接收的数据。返回的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}所必需的})。
我想在预订数组上有一个执行数据转换的只读计算属性。但它可能会对性能产生影响。如果计算属性不是一个选项,我怎么能保持这两个数据结构同步?
答案 0 :(得分:1)
首先,我强烈建议您将字典数组转换为对象数组。应该将JSON解析为模型对象,而不是字典。我一直在编写一个关于这种解析的系列文章,从Functional Wish Fulfillment开始,但你可以使用任何你想要解析的技术。只需将它放入对象(通常是Swift中的结构)。然后你将拥有你的简单数组。
除此之外,在各种Cocoa圈子中越来越倾向于解决“我如何展示这一点”是从传统MVC架构到MVVM架构的过渡。在MVVM体系结构中,您在ViewController和Model之间添加了一个额外的“View Model”层。 ViewModel的工作是将数据按摩到显示层所希望的形式。一旦在模型中有一个好的对象,这可能是必要的,也可能不是必需的。但是,如果您的模型设计与您的View需求不完全匹配,则ViewModel是一个很好的中介。