Yap数据库简介

如果语法一开始看起来很奇怪,请不要紧张,我们将逐一逐一讨论。

让我们一次分解每个块。 首先,有一个分组块,确定要在视图中包括哪些对象。

需要注意的重要一点是,在初始化视图时,将对数据库中的每个对象以及由写入事务添加或修改的每个对象运行此方法 从图书馆的例子来看,这类似于W太太第一次编译书籍清单时以及她检查图书馆中每个新添加的内容以查看其是否满足任何现有清单的标准时。

现在我们有了分组块背后的想法,让我们看一下代码本身。 首先,注意参数列表中省略的参数(即参数名称的“ _”空格)。 这些省略的参数提供了有关传递到块中的对象的更多信息,例如其集合和键值。 但是,我们通常只检查对象以确定是否应将其包括在视图中。 (更多信息可以在这里找到)

一旦确定对象是否应包含在视图中,我们将以字符串形式返回要为其分配对象的组的名称 。 在这种情况下,guard语句会验证我们的输入。 在将对象添加到组之前,我们需要确保它是一本书。 如果验证失败,我们将返回nil并且该对象将不会分配给任何列表。 如果通过,则返回title的第一个字符 。 为什么要这个值? 请记住,我们正在返回要将对象分配给的组的名称,因此我们将在“ 两个城市的故事 ”中返回“ A”。

排序块是创建视图的第二个组件。 在图书馆的例子中,这相当于W夫人问如何对已编译的书籍清单进行排序。 排序方法与典型的比较方法非常相似:参数是组中的两个任意对象,返回类型是NSComparisonResult,表明我们希望如何对它们进行排序。 再一次,在最初编译列表时以及在每次向数据库进行新的写入事务时都将运行此逻辑,因此可以确保始终对列表进行正确排序。

我们创建的视图如何将数据转换为tableView?

简单:我们使用了一个漂亮的工具,称为mappings 。 如果您考虑上面的图像,我们的视图已经被填充和排序,因此tableView已经为我们构造了很多。 现在,我们只需要将每个组映射到其关联的UITableView部分。 (注意:这对于collectionViews同样适用。)

我们可以使用两种策略将每个组映射到其关联的tableView部分。 首先,我们可以静态声明映射及其顺序。

但是,这种策略非常脆弱,特别是因为如果没有任何以该字母开头的书,我们可能无法查看字母表中的每个字母。 相反,有一种更好的策略,即动态声明映射。 本质上,我们希望找到一种方法来告诉Yap映射中包括哪些组以及应如何对映射进行排序。 听起来有点熟? 这正是我们在早先需要确定应包含在视图中的内容时使用的分组和排序块。 我们在这里使用相同的策略来确定如何将组映射到tableView节。