Использование NSSortDescriptor с несколькими ключами и отсутствующими данными - PullRequest
0 голосов
/ 31 января 2019

Я хотел бы отсортировать созданные пользователем контакты, в которых у контактов есть куча данных.В некоторых контактах могут быть заполнены все поля или атрибуты, например, lastName, firstName, company, phone, email, в то время как у других может быть только имя или просто электронная почта или просто компания.

Обычный способ использования дескрипторов NSSortявляется создание NSArray, где первые sortDescriptors в массиве имеют приоритет с связями, разорванными каждым последующим.Таким образом:

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

Есть ли способ сделать это?Как apple делает это со своими контактами?

Спасибо за любые предложения

1 Ответ

0 голосов
/ 31 января 2019

Вместо инициализации дескрипторов сортировки с использованием

initWithKey:ascending:

вы можете использовать

initWithKey:ascending:comparator:

В блоке сравнения

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

вы можете явно проверить nil объектов и установите соответствующий результат сравнения.
Я не проверял это, но он должен работать.

...