我收集了许多信标,报告了它们的距离,并且我正在一个无法更改的,已建立体系结构的项目中工作,否则我可能会选择其他方法。
现有一个信标对象数组,用于报告其平均距离。现有代码按其平均距离对信标数组进行排序,并存储在称为_averageDistance
的属性中。一切正常,直到脱机信标报告nil _averageDistance
指示其不可用为止。
当前代码如下:
NSSortDescriptor* sortOnDistance = [NSSortDescriptor sortDescriptorWithKey:@"averageDistance" ascending:YES];
NSArray* sortDescriptors = [NSArray arrayWithObject:sortOnDistance];
NSArray* sortedBeacons = [allBeacons sortedArrayUsingDescriptors:sortDescriptors];
BOOL sameBeacon = NO;
if(![[sortedBeacons firstObject] isEqual:_closestBeacon]){
_closestBeacon = (PTBeacon*)[sortedBeacons firstObject];
}
else {
sameBeacon = YES;
}
有没有一种方法可以控制对NSArray排序时处理nil值的方式?谢谢!
最佳答案
您可以使用其他排序方法将不可用的信标强制设置为结尾:
[allBeacons sortedArrayUsingComparator:^(PTBeacon * firstBeacon, PTBeacon * secondBeacon){
if( ![firstBeacon averageDistance] ){
return (NSComparisonResult)NSOrderedAscending;
}
else {
return [[firstBeacon averageDistance] compare:[secondBeacon averageDistance]];
}
}];
这使得
averageDistance
为nil
的任何信标比任何其他信标都具有更大的比较,这与当前正在发生的情况相反。不可用的信标将(在它们之间以任意顺序)结束于已排序数组中的任何其他信标。或者您可以在排序之前过滤数组:
NSPredicate * availabilityPredicate = [NSPredicate predicateWithFormat:@"averageDistance != NIL"];
NSArray * allAvailableBeacons = [allBeacons filteredArrayUsingPredicate:availabilityPredicate];
这将导致
allAvailableBeacons
仅包含averageDistance
不是nil
的信标。然后,您对该数组进行排序,而不是对原始数组进行排序。关于ios - NSSortDescriptor对可能为零的属性进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33553116/