使用 NSSortDescriptor 将“nil”值保留在列表底部

Posted

技术标签:

【中文标题】使用 NSSortDescriptor 将“nil”值保留在列表底部【英文标题】:Using NSSortDescriptor to keep 'nil' values at the bottom of a list 【发布时间】:2014-02-08 08:40:01 【问题描述】:

我正在对NSFetchedResultController 数据进行排序。我需要按他们的名字对数据进行排序。但是,有些条目没有名字。

我需要“没有名字”的对象出现在列表的底部,而不是顶部。使用当前代码,当我按名字对列表进行排序时,“无名字”单元格位于顶部。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contacts"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]];
_FRC = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                            managedObjectContext:MOC
                                           sectionNameKeyPath:nil cacheName:nil];   
_FRC.delegate = self;

【问题讨论】:

【参考方案1】:

在与同事协商后更新:)

首先,您是在谈论“空白”(如在其中包含空格的字符串中)还是“nil”(完全没有值的属性)?

想到的一个想法是添加一个名为hasFirstNameBOOL,然后首先对hasFirstName 进行排序,然后对firstName 进行排序。

【讨论】:

【参考方案2】:

NSSortDescriptor 有 sortDescriptorWithKey:ascending:comparator: 方法。使用此方法,您可以进行自定义比较并将空项目移动到底部。比较器块可能如下所示:

^NSComparisonResult(NSString *obj1, NSString *obj2) 
     if (obj1.length == 0) 
         return NSOrderedDescending;
     
     if (obj2.length == 0) 
         return NSOrderedAscending;
     

     return [obj1 compare:obj2];
 

【讨论】:

以上是关于使用 NSSortDescriptor 将“nil”值保留在列表底部的主要内容,如果未能解决你的问题,请参考以下文章

NSSortDescriptor 未正确排序整数

使用两个 NSSortDescriptor 过滤数组

使用 NSSortDescriptor 按时间倒序对 CoreData 进行排序

可以将“self”与 NSSortDescriptor 一起使用来按对象本身而不是对象的属性进行排序? (核心数据/NSFetchedResultsController)

创建 NSSortDescriptor

NSSortDescriptor 生成 ORDER BY `name` = 'bob' DESC?