0

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

在这里我有点困惑这个块是如何工作的?它是一个异步调用(在这种情况下它应该产生输入数组本身)。有人可以解释吗?

+(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;
}
4

2 回答 2

0

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

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

NSArray sortedArrayUsingComparator 做:

  1. 从数组中获取两个对象。
  2. 通过块中的比较功能比较这两个对象。(得到 NSOrderedAscending, NSOrderedSame,NSOrderedDescending 的结果)
  3. 根据比较结果将对象放入新数组。
  4. 如果原始数组中仍有对象,则继续执行一项。
  5. 在所有对象排序后返回新数组。

(1,4的运算可能因排序算法而异,但基本思想是相同的。)

于 2013-11-07T07:57:35.387 回答
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]];
于 2016-09-24T07:53:12.993 回答