NSSortDescriptor с поведением изменений компаратора при получении или начальной загрузке - PullRequest
2 голосов
/ 01 ноября 2011

Я получаю очень странное поведение с NSSortDescriptor.Давайте начнем с моего кода:

NSSortDescriptor *nameExists = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES comparator:^(id obj1, id obj2){
  if ( ([obj1 isEqualToString:@""] || [obj1 isKindOfClass:[NSNull class]] || obj1 == nil) && ![obj2 isEqualToString:@""]){
    return NSOrderedDescending;
  }
  else if ( ![obj1 isEqualToString:@""] && ([obj2 isEqualToString:@""] || [obj2 isKindOfClass:[NSNull class]] || obj2 == nil) ){
    return NSOrderedAscending;
  }
  return NSOrderedSame;
}];

Это дескриптор сортировки, который я использую для упорядочения пользователей в моей базе данных теми, у кого есть поля имени, и теми, кто его не имеет.Таким образом, если у вас есть список пользователей из 20 человек, а у 5 человек нет имен, а у 15 - имена, 15 с именами будут отсортированы раньше, чем без.Это в отличие от обычного поведения сортировки строкового поля по возрастанию, при котором записи с пустыми полями отображаются перед непустыми полями.

Когда я впервые загружаю представление, этот дескриптор сортировки возвращаетсяк поведению по умолчанию - с пустыми полями перед полными полями, как будто моего компаратора там не было.

Однако, если я добавляю новые записи в Core Data, мой NSFetchedResultsController загружает записи должным образом, и в соответствии с моимкомпаратор.

Моя интуиция сказала мне, что с размещением моего блока что-то не так.У меня это в методе инициализации представления.Однако я изменил его на метод loadView, и его поведение не изменилось.

Кто-нибудь знает, что происходит?

...