Сортировка по датам (включая ноль) с NSFetchedResultsController - PullRequest
2 голосов
/ 27 марта 2010

В моем NSFetchedResultsController я установил sortDescriptor, который сортирует на основе свойства date моих управляемых объектов. Проблема, с которой я столкнулся (наряду с несколькими другими, согласно Google), состоит в том, что значения nil сортируются в самом раннем конце, а не в самом конце спектра дат. Я хочу, чтобы мой список сортировался раньше, раньше, сейчас, позже, позже, ноль. Насколько я понимаю, эта сортировка выполняется на уровне базы данных в SQLite, и поэтому я не могу создать свой собственный метод сравнения: для предоставления нужной сортировки.

Я не хочу вручную сортировать в памяти, потому что мне пришлось бы отказаться от всех преимуществ NSFetchedResultsController. Я не могу сделать составную сортировку, потому что sectionNameKeyPaths тесно связаны с диапазонами дат. Я мог бы написать подпрограмму, которая перенаправляет запросы indexPath так, чтобы секция 0 в контроллере результатов была сопоставлена ​​с последней секцией tableView, но я боюсь, что это добавит много накладных расходов, серьезно увеличит сложность моего кода и будет очень, очень подвержен ошибкам.

Самая последняя идея, которую я рассматриваю, состоит в том, чтобы сопоставить все ноль дат с самым дальнейшим датой, которую поддерживает NSDate. Мой левый мозг ненавидит эту идею, так как это больше похоже на взлом. Это также потребует немного усилий для реализации, так как проверка на нулевые факторы в значительной степени влияет на то, как я обрабатываю даты в моем приложении. Я не хочу идти по этому пути без предварительной проверки лучших вариантов. Кто-нибудь может придумать лучший способ обойти эту проблему?

Обновление

Возможно, лучший способ обойти эту проблему - переключиться на двоичное постоянное хранилище. Из того, что я прочитал в документации, сортировка выполняется в Objective-C с двоичным постоянным хранилищем, поэтому я мог предоставить свой собственный метод сравнения для сортировки по дате. У меня есть две проблемы с этим подходом. Во-первых, какой удар по производительности я собираюсь увидеть, перейдя в бинарный магазин? Во-вторых, насколько сложно будет развернуть это изменение в обновлении приложения?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2010

Я решил пойти с исправлением "hack", потому что я не хотел нести накладные расходы на загрузку всего графа объектов в память, которая идет с использованием двоичного хранилища. Вместо того, чтобы хранить nil, когда пользователь не устанавливает дату, я сохраняю результат метода класса "noDate".

0 голосов
/ 27 марта 2010

Я не знаю, возможно ли изменить место сортировки nil-дат в NSFetchedResultsController. Тем не менее, у меня есть предложение в духе вашего «хака» об изменении нулевых дат на будущее. В частности, я бы создал новое временное свойство для вашей сущности, которое возвращает измененную дату. По сути, пользовательский метод получения этого свойства извлекает дату, а затем проверяет, является ли она нулевой. Если это так, он вернет самую последнюю будущую дату, которую поддерживает NSDate. Это позволит NSFetchedResultsController сортировать результаты так, как вы хотите.

Использование временных свойств - это то, как создаются списки с разделами, использующими первую букву фамилии человека (как приложение «Контакты»). Метод для этого описан здесь .

Например:

// THIS ATTRIBUTE GETTER GOES IN YOUR OBJECT MODEL FOR THE 
// TRANSIENT PROPERTY modifedDate
- (NSDate *) modifiedDate {
  [self willAccessValueForKey:@"date"];
  NSDate * date = [self date];
  if(date == nil)
    date = // Set as furthest future date.
  [self didAccessValueForKey:@"date"];
  return date;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...