Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSSortDescriptor对可能为零的属性排序_Ios_Objective C_Nsarray_Nssortdescriptor - Fatal编程技术网

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
的信标。然后对该数组而不是原始数组进行排序