IGListkit 网络责任

Posted

技术标签:

【中文标题】IGListkit 网络责任【英文标题】:IGListkit networking responsibility 【发布时间】:2018-09-29 23:52:28 【问题描述】:

使用 IGListkit,对抓取数据的职责有点困惑。

虚拟示例 - 假设我正在处理车辆类别,并且我希望有一个部分控制器基本上对某个类别的汽车品牌进行处理。

我的视图控制器有一个品牌概念,部分控制器将显示这些汽车品牌的模型列表:

本田 公民 飞行员 雅阁

在应用程序中,我需要进行网络调用以获取各个模型。

这个责任是否应该由视图控制器负责,本质上是多次调用 api,获取品牌的所有模型,构建模型,然后将它们传递给部分控制器?

或者视图控制器会简单地将品牌(本田)传递给部分控制器,然后部分控制器负责进行网络调用并获取它的所有品牌并重新加载自己?

【问题讨论】:

我个人会创建一个 MVVM 架构,每个视图模型负责获取数据。但是如果是这种情况,您可以简单地使您的模型以这种方式制作,这样它们就可以有一个品牌名称作为字符串和一个 carModels 数组,这是另一个具有名称等的模型。通过这种方式,您可以在第一个视图控制器,然后在 sectioncontroller 内部,您可以访问每个品牌的每个数组。 【参考方案1】:

IGListKit 处理对象数组来为它们创建必要的部分。我不会将所有网络都放在 UIViewController 类中,而是为您的特定任务创建一个 ListAdapterDataSource 子类,该子类将执行 3 个不同的网络请求。

在他们每个人的回调中,您会将结果附加到 ListDiffable 数组:

var users: [ListDiffable] = [] 
    didSet 
        update()
    


private func update() 
    DispatchQueue.main.async  [weak self] in
        self?.adapter.performUpdates(animated: true, completion:  _ in
            self?.loading = false
        )
    

以这种方式调用 performUpdates 可确保 IGListKit 使用其智能差异算法仅更改/添加最近添加的单元格,保持已显示完整且不影响性能。您可以在ListAdapterDataSource 协议的func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController 方法中为部分/单元格设置不同的类

【讨论】:

以上是关于IGListkit 网络责任的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中使用 IGListKit 创建一个两列集合视图列表

IGListKit:获取当前可见的单元格索引

当调用 `performUpdates(:)` 时,由 IGListKit 提供支持的 UICollectionView 停止滚动

如何使用 IGListKit 滚动到部分的底部

IGListKit - IGListSectionController 中的动态 .minimumLineSpacing

具有部分和多个项目的 IGListKit