Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将NSINDExpath映射到数据标识符_Ios_Mvvm_Swift - Fatal编程技术网

Ios 将NSINDExpath映射到数据标识符

Ios 将NSINDExpath映射到数据标识符,ios,mvvm,swift,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", "chec

我使用集合视图显示从服务器接收的数据。返回的预订的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协议。更具体地说,一个节包含具有相同属性id的所有预订。因此,我必须进行数据转换,以将json数组映射到节和项。在反序列化GJSON和数据转换后的Swift中,它看起来是这样的(键是属性\u id,值是该属性\u id的预订数组):

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

更一般地说,我要问的是:如何处理从模型到视图控制器的数据格式(对于数据源方法
numberOfSectionsInCollectionView:
collection:numberofitemsinssection:
collectionView:cellForItemAtIndexPath:
来说是必需的)


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

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


除此之外,在各个Cocoa圈子中,越来越多的人倾向于解决“如何显示这个”的问题,这就是从传统的MVC架构向MVVM架构的过渡。在MVVM体系结构中,在ViewController和模型之间添加一个额外的“视图模型”层。ViewModel的工作是将数据转换为显示层希望它处于的形式。一旦您的模型中有了一个好的对象,这可能是必要的,也可能不是必要的。但是,如果您的模型设计与视图需求不完全匹配,那么ViewModel是一个很好的中介。

@Rob Napier几天前写了一篇关于“展平地图打开”的帖子。看看它。你会考虑使用CordaDATA来存储那个信息吗?@ Pob谢谢,我正在阅读。@ PbDDF没有CordEDA,而是一个持久的API来保存预订。谢谢。我会看JSON解析。是的,理想情况下,模型应为[Booking]类型,但在数据转换后,将适当的节/项信息传递给
numberOfSectionsInCollectionView:
collectionView:numberOfItemsInSection:
collectionView:cellForItemAtIndexPath:
,而PerformButUpdate方法和RESTful端点通常是CRUD操作,更容易对原始数据执行。这可能就是ReactiveCocoa用来保持模型和转换数据同步的原因?ReactiveCocoa当然是这里的一个选项,但是您可以创建VM对象而不需要它。MVVM与反应式编程是完全不同的,尽管它们通常一起使用。在这里描述的情况下,我当然会使用VM对象。您的模型->视图逻辑可能会很复杂,将其放入自己的类中要容易得多。我链接的页面和后面的文章中讨论的功能工具非常适合这些类型的数据转换。
[
   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"]]
]