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];
请注意,这不会重新排序数组(因为通常数组是不可变的)。在像NSFetchedResultsController
或MZRelationalCollectionController
这样的动态更新集合的情况下,控制器的KVO调用负责重新排序数组并按需更新UI。
虽然MZFastSortIndex
适合用于常见情况,但对其未来计划有一些。
long long
执行32位数学来避免溢出。我们需要清理这一数学,以便我们可以提供64位索引的选项。iOS 8和ARC。MZFastSortIndex
与任何KVC兼容的数据源一起工作。
通过CocoaPods可以获得MZFastSortIndex。要安装它,只需将以下行添加到您的Podfile
pod "MZFastSortIndex"
Mat Trudel,[email protected]
MZFastSortIndex在MIT许可下可用。有关更多信息,请参阅LICENSE文件。