在NSComparator块中幕后发生了什么?

时间:2014-01-17 03:35:41

标签: ios objective-c

我查看了一些问题,例如Sort NSDates inside NSDictionary inside NSArray?,解释了如何对一组字典进行排序。但我还没有找到NSComparator块实际工作原理的解释,我真的很好奇。

示例代码(来自上面链接的Q):

NSComparator sortByDate = ^(id dict1, id dict2) {
    NSDate* n1 = [dict1 objectForKey:@"Date"];
    NSDate* n2 = [dict2 objectForKey:@"Date"];
    return [n1 compare:n2];
};

[self.cellArray sortUsingComparator:sortByDate];

该块的两个输入来自哪里?如何对集合进行排序所需的迭代起作用?等等,谢谢!

2 个答案:

答案 0 :(得分:4)

想象一下,你正在编写这样做的方法。您可以使用任何有效的排序算法对数组进行排序(哪一个无关紧要,这是计算机科学中一个研究得很好的问题)。

在此排序方法的核心,您将比较两个项目,以查看哪个项目的订购要高于另一个项目。但是在编写泛型排序方法时,您不知道如何对实际对象进行排序。因此,您将实际的比较方法留给实际想要使用您的方法的人,并且他们将在块中提供该方法。所以,你会写这样的方法。

- (NSArray *)mySortMethodUsingBlock:(NSComparator(^)(id obj1, id obj2))comparator {
    // Keep repeating these steps til the array is sorted:
    // Some methods to walk the array get two elements to examine
    // Pass these two objects to the block that the user has provided and get their order
    NSComparator result = comparator (anObj, anotherObj);
    // Use the result to determine how the objects are positioned

    // Return the sorted array.
}

因此。在创建比较器块时 - 您只是告诉方法如何比较两个对象。然后,该方法可以使用此信息以有效的方式对数组进行排序。

答案 1 :(得分:1)

数组的排序方法的实现可能使用二进制排序或一些其他有效的排序算法,需要重复比较数组中的两个对象。每次需要进行比较时,它都会调用块传递它需要评估的两个对象。块的结果告诉算法两个对象如何相互比较。