NSSortDescriptor с компаратором изменяет поведение при выборке и начальной загрузке

#iphone #cocoa #ios4 #core-data #nssortdescriptor

#iPhone #cocoa #ios4 #core-данные #nssortdescriptor

Вопрос:

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

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

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

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

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

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

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