将NSSortDescriptor与多个键结合使用并丢失数据

时间:2019-01-31 18:15:52

标签: ios nssortdescriptor

我想对用户创建的联系人进行排序,其中联系人具有大杂烩的数据。某些联系人可以具有每字段或属性填充在例如姓,名,公司,电话,电子邮件,而其他人可能只有名字,电子邮件或公司。

使用NSSort描述符的惯用方法是创建一个NSArray,其中数组中的第一个sortDescriptor优先于每个相继的中断的联系。因此:

NSSortDescriptor *last =[[NSSortDescriptor alloc]initWithKey:@"lastname" ascending:YES];
NSSortDescriptor *first =[[NSSortDescriptor alloc]initWithKey:@"firstname" ascending:YES]; 
NSSortDescriptor *company =[[NSSortDescriptor alloc]initWithKey:@"company" ascending:YES]; 
NSSortDescriptor *email =[[NSSortDescriptor alloc]initWithKey:@"email" ascending:YES];   
[request setSortDescriptors:[NSArray arrayWithObjects:last, first, company,email, nil]];

应用于

  Allen,Joe,microsoft,ja@microsoft.com|Allen,Zack,google,nil|Smith,Tom,Apple,nil 

会给你:

Allen, Joe
Allen, Zack
Smith, Tom

看起来不错。

但是,如果您的数据如下:

Allen,Joe,nil,ja@gmail.com|nil,Zack,nil,zack@msn.com|nil,nil,nil,raj@gmailcom|nil,nil,cloudflare,nil

以上内容将为您提供:

cloudflare
raj@gmail.com
Zack
Allen, Joe

一团糟。

在第二种情况下,我想让事情更有意义,如果仅按电子邮件对电子邮件进行排序,然后再按仅按公司对公司进行排序,然后按姓氏,然后按名字进行排序

raj@gmail.com
cloudflare
Allen, Joe
Zack

,甚至他们按顺序排列的任何字段

Allen, Joe
cloudflare
raj@gmail.com
Zack

有什么办法可以做到这一点?苹果如何与他们的联系人联系?

感谢任何建议

1 个答案:

答案 0 :(得分:1)

不是使用

初始化您的排序描述符
initWithKey:ascending:

您可以使用

initWithKey:ascending:comparator:

在比较器块中

^NSComparisonResult(id obj1, id obj2)  {…}

你可以显式检查nil对象,并设置将比较结果作为合适的。
我没有检查,但是应该可以。