sortedArrayUsingComparator的行为

时间:2013-09-25 10:39:24

标签: ios objective-c arrays sorting

我正在理解目标C块。大多数时候我一直在处理Web调用的异步块。但是我在这里有一个方法来返回自定义对象的排序数组(按属性的字母顺序)。

这里有点混淆这个块是如何工作的?它是异步调用(在这种情况下它应该产生输入数组本身)。谁能解释一下?

+(NSArray*)sortedListAlphabetically:(NSArray*)_unsortedList{
    NSArray *sortedArray;
    sortedArray = [_unsortedList sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
        NSString *first = [(customObject*)a userName];
        NSString *second = [(customObject*)b userName];
        return [first compare:second];
    }];
    return  sortedArray;
}

2 个答案:

答案 0 :(得分:0)

这是块中的同步调用,您可以将块视为比较两个对象的函数。使用此比较功能,系统可以对数组进行排序。按代码解释:

function : ^NSComparisonResult(id a, id b) - 由您在区块代码中提供。

NSArray sortedArrayUsingComparator do:

  1. 从阵列中获取两个对象。
  2. 通过块中的compare函数比较这两个对象。 (获得NSOrderedAscending,NSOrderedSame,NSOrderedDescending的结果)
  3. 根据比较结果将对象放入新数组。
  4. 如果原始数组中仍有对象,则继续执行一个。
  5. 在所有对象排序后返回新数组。
  6. (基于排序算法,1,4的操作可能不同,但基本思路是相同的。)

答案 1 :(得分:0)

值得一提的是,此方法在多个排序条件操作中不提供递归循环。假设您想要排序一个像unsortedList = @[@{@"name":"...", @"isFavourite":"..."},...]这样的数组,将最喜欢的元素放在不喜欢的元素之前,并按字母顺序按名称排序每个子组,以下代码将不起作用:

sortedArray = [unsortedList sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        NSDictionary *one = (NSDictionary*)obj1;
        NSDictionary *two = (NSDictionary*)obj2;
        NSString *name1 = [one objectForKey:@"name"];
        NSString *name2 = [two objectForKey:@"name"];
        NSInteger isFav1 = [[one objectForKey:@"isFavourite"] integerValue];
        NSInteger isFav2 = [[two objectForKey:@"isFavourite"] integerValue];
        if (isFav1 > isFav2)
            return NSOrderedAscending;
        else if (isFav1 < isFav2)
            return NSOrderedDescending;
        else
            return [name1 compare:name2];
    }];

你必须在块中引入一个或多个for循环,因此我发现使用sortedArrayUsingDescriptors:这样的复杂排序操作更有效:

NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"isFavourite" ascending:NO];
NSSortDescriptor *descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
sortedArray = [unsortedList sortedArrayUsingDescriptors:@[descriptor1, descriptor2]];