Ios NSSortDescriptor对可能为零的属性排序
我有一组信标报告它们的距离,我正在一个拥有既定体系结构的项目中工作,我无法改变,否则我可能会选择不同的方法 现有的信标对象阵列报告其平均距离。现有代码根据平均距离对信标数组进行排序,该平均距离存储在名为Ios NSSortDescriptor对可能为零的属性排序,ios,objective-c,nsarray,nssortdescriptor,Ios,Objective C,Nsarray,Nssortdescriptor,我有一组信标报告它们的距离,我正在一个拥有既定体系结构的项目中工作,我无法改变,否则我可能会选择不同的方法 现有的信标对象阵列报告其平均距离。现有代码根据平均距离对信标数组进行排序,该平均距离存储在名为\u averageDistance的属性中。一切正常,直到离线信标报告nil\u averageDistance表示它不可用 当前代码如下: NSSortDescriptor* sortOnDistance = [NSSortDescriptor sortDescriptorWithKey:@"
\u averageDistance
的属性中。一切正常,直到离线信标报告nil\u 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值的方式?谢谢 我将编写一个自定义的
NSSortDescriptor
来处理您认为合适的nil值:
NSSortDescriptor* sortOnDistance = [NSSortDescriptor sortDescriptorWithKey:@"averageDistance"
ascending:YES
comparator:^NSComparisonResult(id obj1, id obj2) {
if(obj1 == nil){
//customize here
return NSOrderedDescending;
}else if(obj2 == nil){
return NSOrderedAscending;
}else{
return [obj1 compare:obj2];}
}];
您可以使用不同的排序方法将不可用的信标强制终止:
[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];
这将导致allavailablebeacon
仅包含averageDistance
不是nil
的信标。然后对该数组而不是原始数组进行排序