我收集了许多信标,报告了它们的距离,并且我正在一个无法更改的,已建立体系结构的项目中工作,否则我可能会选择其他方法。

现有一个信标对象数组,用于报告其平均距离。现有代码按其平均距离对信标数组进行排序,并存储在称为_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]];
    }
}];


这使得averageDistancenil的任何信标比任何其他信标都具有更大的比较,这与当前正在发生的情况相反。不可用的信标将(在它们之间以任意顺序)结束于已排序数组中的任何其他信标。

或者您可以在排序之前过滤数组:

NSPredicate * availabilityPredicate = [NSPredicate predicateWithFormat:@"averageDistance != NIL"];
NSArray * allAvailableBeacons = [allBeacons filteredArrayUsingPredicate:availabilityPredicate];


这将导致allAvailableBeacons仅包含averageDistance不是nil的信标。然后,您对该数组进行排序,而不是对原始数组进行排序。

关于ios - NSSortDescriptor对可能为零的属性进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33553116/

10-11 22:54
查看更多