【问题标题】:Mapping NSIndexPaths to data identifiers将 NSIndexPaths 映射到数据标识符
【发布时间】:2014-09-12 12:40:03
【问题描述】:

我正在使用集合视图来显示从服务器接收到的数据。返回的预订的 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 数组映射到部分和项目。在反序列化 JSON 和数据转换后的 Swift 中,它看起来像这样(键是 property_id,值是该 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:collectionView:cellForItemAtIndexPath: 是必需的)。

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

【问题讨论】:

  • @Rob Napier 几天前写了一篇关于“扁平化映射”的帖子。看看here
  • 你会考虑使用 CoreData 来存储这些信息吗?
  • @POB 谢谢,我正在阅读。
  • @pbasdf 没有 CoreData,但有一个 RESTful api 来保留预订。

标签: ios mvvm swift


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我会研究一下 JSON 解析。是的,理想情况下,模型将是 [Booking] 类型,但在数据转换之后,将 [String : [Booking]] 将适当的部分/项目信息传递给 numberOfSectionsInCollectionView:collectionView:numberOfItemsInSection:collectionView:cellForItemAtIndexPath:,而 performBatchUpdates 方法和RESTful 端点通常是更容易对 原始 数据执行的 CRUD 操作。这也许就是 ReactiveCocoa 的用武之地,可以让模型和转换后的数据保持同步?
  • ReactiveCocoa 当然是这里的一种选择,但您可以在没有它的情况下创建 VM 对象。 MVVM 与反应式编程完全不同,尽管它们很流行一起使用。在您在此处描述的情况下,我当然会使用 VM 对象。您的模型-> 视图逻辑可能很复杂,将其放入自己的类中要容易得多。在我链接的页面和后面的帖子中讨论的功能工具非常适合这些类型的数据转换。
猜你喜欢
  • 2017-08-07
  • 2014-02-02
  • 2012-01-23
  • 1970-01-01
  • 2018-06-04
  • 2014-10-30
  • 2017-07-09
  • 2021-12-09
  • 2015-04-20
相关资源
最近更新 更多