MZFastSortIndex 0.2.1

MZFastSortIndex 0.2.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2016年3月

Mat Trudel 维护。



  • 作者
  • Mat Trudel

背景

MZFastSortIndex 允许您以高效的方式在无序集合中对对象进行排序和重新排序,使用单个 NSNumber 字段存储排序顺序。为此,我们将为对象的排序字段推导出一个值,该值将按排序顺序将其放置在集合中的预期位置。当需要时,MZFastSortIndex 还将重新索引集合中的其他对象,以提供必要的插入空间。它以优化索引(在数字范围的使用方面)的方式进行,从而最小化后续插入操作所需的重新索引次数。

这种方法在实际中对无序集合有很多优点;通常情况下,在集合中重新排序对象(例如,通过在表格或集合视图中拖动 UI 项目)会导致单个对象发生突变;在常见情况下,不需要中间记录更新其索引值以维护集合的预期顺序。在需要重新排列对象为新插入或移动的对象腾出空间的情况下,MZFastSortIndex 会自动为您完成,优化的重新索引对象以为未来的移动或插入提供尽可能多的空间。

删除单个对象永远不会影响集合中的其他对象;剩余的对象不需要将其索引值重新排序以填充空缺。

您可以应用 MZFastSortIndex 到任何现有的有效整数排序字段,该字段可以按升序对您的集合中的对象进行排序。它将维护现有项的有效排序,并逐渐扩展到最佳使用可能的索引值范围。

在 Core Data 模型方面,MZFastSortIndex 将与至少 32 位宽的任何整数字段一起工作(特别是,它源于一个我们使用了 Integer 32 排序字段的项目)。

在读取时,所需的一切就是像通常那样对您的集合进行排序(例如通过 NSSortDescriptor 对象)。如果您的数据由 Core Data 存储支持,您可以通过 SQLite 享受核心数据为您索引排序字段并进行超快读取的优势。

用法

有两个主要用例:将新对象插入集合中,以及在集合中将对象移动位置。

向集合中插入

通常,这是通过首先设置新对象的索引值,然后将它插入到集合中来完成的。这确保了集合的状态始终保持有效。

[newObject setValue:[array mz_valueForKeyToLieAtEndOfSortedArray:@"index"] forKey:@"index"];
[array addObject:newObject];

请注意,对于无序列表集合(如Core Data),您仍需要在排序数组上调用 mz_valueForKeyToLieAtEndOfSortedArray:。这是因为新的插入可能需要重新索引列表中的任何数量的元素,而这个操作依赖于能够按照排序顺序访问元素。

在集合中移动对象

在这种情况下(通常由用户在集合或表格视图中拖动相关对象引起),对象已经是相应集合的成员,重新索引只是单个调用的事情

[array mz_setSortKey:@"index" onObject:object toLieAtSortedIndex:newIndex];

请注意,这不会重新排序数组(因为通常数组是不可变的)。在像NSFetchedResultsControllerMZRelationalCollectionController这样的动态更新集合的情况下,控制器的KVO调用负责重新排序数组并按需更新UI。

待办事项

虽然MZFastSortIndex适合用于常见情况,但对其未来计划有一些。

  • 在紧循环中删除NSObject分配。我们做的一些简单的数值事情可能更好地用标准标量表达
  • 探索已满的行为。我们目前使用有符号的int32作为可能的索引范围。没有显式测试用例来覆盖索引耗尽,而应该有一个。
  • 允许(可选)64位索引。目前我们(懒惰地)依赖于能够用long long执行32位数学来避免溢出。我们需要清理这一数学,以便我们可以提供64位索引的选项。

要求

iOS 8和ARC。MZFastSortIndex与任何KVC兼容的数据源一起工作。

安装

通过CocoaPods可以获得MZFastSortIndex。要安装它,只需将以下行添加到您的Podfile

pod "MZFastSortIndex"

作者

Mat Trudel,[email protected]

许可

MZFastSortIndex在MIT许可下可用。有关更多信息,请参阅LICENSE文件。