ArrayUpdater 1.4.0

ArrayUpdater 1.4.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2019年4月
SPM支持 SPM

Todd Kramer 维护。



ArrayUpdater

Build Status CocoaPods Version Swift Platform Swift Package Manager compatible Carthage compatible

概述

ArrayUpdater 是一个用于计算从一组数组到另一组数组所需插入、删除和重载的框架。其主要用途是在呈现的数据发生变化时简化更新表格和集合视图的过程。该框架返回一个包含所需插入、删除和重载的结构体,以及将它们映射到索引的便利函数。随后,这些索引可以直接用于开始/结束更新调用(表格视图)或performBatchUpdates调用(集合视图)。

使用方法

协议要求

代码

struct Park: Updatable {

    let id: String
    let name: String

}

说明

为了让ArrayUpdater计算插入和删除,类型必须遵守Equatable协议。然而,框架还需要某种方法来知道对象或值在意义上更新了,即使它们相等(重新加载)。

针对此,ArrayUpdater提供了扩展Hashable(它反过来扩展了Equatable)的Updatable协议。Updatable有一个要求,即类型必须有id属性。遵守的类型将实现Equatable,框架将使用相等检查和id属性来确定数组中哪些项需要就地更新。

更新数组

代码

let arches = Park(id: "NPS01", name: "Arches")
let grandCanyon = Park(id: "NPS02", name: "Grand Canyon")
let greatSmoky = Park(id: "NPS03", name: "Great Smoky Mountains")
let greatSmoky2 = Park(id: "NPS03", name: "Great Smokies")
let yosemite = Park(id: "NPS04", name: "Yosemite")
let zion = Park(id: "NPS05", name: "Zion")

let parks1 = [arches, greatSmoky, yosemite, zion]
let parks2 = [zion, grandCanyon, greatSmoky2, yosemite, arches]

let update = parks1.update(to: parks2)
print(update)

输出

▿ Update
  ▿ reloads : 1 element
    - 0 : 1
  ▿ deletions : 2 elements
    - 0 : 0
    - 1 : 3
  ▿ insertions : 3 elements
    - 0 : 0
    - 1 : 1
    - 2 : 4

说明

表格和集合视图按特定顺序执行更新,在插入之前先发生重载和删除。因此,在上面的例子中,让我们从第一个数组开始,看看我们是怎样得到第二个数组的。

  1. 我们在索引1处进行了一次重载。"greatSmoky"和"greatSmoky2"因为它们的id相等而被认为是相等的,但它们的名称不匹配,因此该项需要重载。由于重载和删除发生在插入之前,所以这次重载是在其索引1处执行的,这在第一个数组中。
  2. 我们有两个删除操作,分别在索引0和3处。同样,删除操作发生在插入之前。在我们的例子中,"arches"和"zion"已改变位置,因此需要在被重新插入到新位置之前被删除。
  3. 此时我们的数组是[greatSmoky2, yosemite]。为了得到parks2,我们需要在索引0、1和4处分别插入"zion"、"grandCanyon"和"arches"。

有关更多信息,请参阅Apple文档中的“操作顺序和索引路径”部分