我正在理解目标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;
}
答案 0 :(得分:0)
这是块中的同步调用,您可以将块视为比较两个对象的函数。使用此比较功能,系统可以对数组进行排序。按代码解释:
function : ^NSComparisonResult(id a, id b)
- 由您在区块代码中提供。
NSArray sortedArrayUsingComparator do:
(基于排序算法,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]];